【问题标题】:Dancer2 not writing anything to a log file or maybe not reading config fileDancer2 没有向日志文件写入任何内容,或者可能没有读取配置文件
【发布时间】:2018-06-24 11:19:03
【问题描述】:

这是 Dancer2 迷你应用:

#!/usr/bin/env perl

use v5.14;

use Dancer2;
use File::Slurper qw(read_text);

set content_type => 'application/json';

my $path;
for my $p ( qw( hitos.json /data/hitos.json ./data/hitos.json ../data/hitos.json) ) {
  if ( -r $p ) {
    $path = $p;
  }
}

my $hitos = from_json read_text($path);

get '/status' => sub {
  return to_json { status => 'OK' };
};

get '/all' => sub {
  return to_json $hitos;
};

start;

使用这个配置文件:

logger : "File"
engines:
  logger:
    File:
      log_level: core
      log_dir: "/tmp"
      file_name: "p5hitos.log"

我已将其命名为 config.ymlconfig.yaml,并且还尝试使用 JSON 配置选项。我试图从中设置端口,但它没有“捕获”端口设置,所以问题可能是配置文件静默失败吗?我也尝试在同一个文件上设置配置:

set content_type => 'application/json';
set logger => "File";
set port => 31415;
set engines => { logger => { File => { log_level => "core",
                       log_dir => ".",
                       file_name => "p5hitos.log" }}};

在这种情况下,端口和内容类型设置正确,但仍然无法使用此 log_dir 或 /tmp。我还尝试了来自this test 的代码并逐字复制它(在设置引擎和小写file 之后设置记录器是唯一的区别)。它不会改变。 config 还是一样的:

0  HASH(0x2a3d070)
   'appdir' => '/home/jmerelo/'
   'apphandler' => 'Standalone'
   'behind_proxy' => 0
   'charset' => ''
   'content_type' => 'application/json'
   'engines' => HASH(0x2947a58)
      'logger' => HASH(0x2947008)
         'File' => HASH(0xa438b0)
            'file_name' => 'p5hitos.log'
            'log_dir' => '/tmp'
   'environment' => 'development'
   'host' => '0.0.0.0'
   'logger' => Dancer2::Logger::File=HASH(0x2a7ef58)
      'app_name' => 'main'
      'config' => HASH(0x2a7f1b0)
           empty hash
      'environment' => 'development'
      'file_name' => 'p5hitos.log'
      'location' => '/home/jmerelo/'
      'log_dir' => '/tmp'
      'log_format' => '[%a:%P] %L @%T> %m in %f l. %l'
      'log_level' => 'debug'
   'no_server_tokens' => 0
   'port' => 31415
   'public_dir' => '/home/jmerelo/public'
   'route_handlers' => ARRAY(0x2779490)
      0  ARRAY(0x27791d8)
         0  'AutoPage'
         1  1
   'startup_info' => 1
   'static_handler' => undef
   'template' => 'Tiny'
   'traces' => 0
   'views' => '/home/jmerelo/views'

它启动并正确返回了两条路由,但没有创建日志文件,显然上面没有写任何内容。控制台上也没有错误,也没有登录。它只显示启动消息:>> Dancer2 v0.204001 server 16427 listening on http://0.0.0.0:3000。日志文件对象似乎已正确创建,但它没有响应。有什么想法吗?

【问题讨论】:

  • 关于您的第一个问题(确保实际上正在读取“config.yml”),可能值得检查一下配置文件上的权限设置是否正确(即,在哪个用户下使用 plackup / Starman正在运行实际上具有读取它的权限)。而且 - 以防万一 - 它位于正确的目录中(PSGI 应用程序的根目录)?
  • 这个项目的目录结构是什么?
  • 这就是你所看到的,那个简单的文件和配置文件,都在同一个目录,同一个权限,并以用户身份运行。

标签: perl web-services logging dancer


【解决方案1】:

app.psgi 看起来像这样:

use v5.14;
use Dancer2;
set content_type => 'application/json';
get '/' => sub {
    debug "Hello World";
    return to_json config;
};
start;

在同一目录config.yml 看起来像这样:

param: Foo
logger : "File"
engines:
  logger:
    File:
      log_level: core
      log_dir: "/tmp"
      file_name: "p5hitos.log"

我以plackup app.psgi 启动应用程序,然后以curl http://0:5000/ | jq 从另一个窗口访问它

日志条目按预期保存在 /tmp/p5hitos.log 中,并且在命令行的输出中我可以看到所有配置值。默认的和我提供的。

【讨论】:

  • 它现在主要工作,所以谢谢。我仍然无法弄清楚是什么问题。但是,现在有几件事不起作用:我尝试在配置文件中设置port: 31415 content_type: "application/json",但它什么也没做,它仍然使用默认设置。在程序上设置 content_type 也不起作用。有什么想法吗?
  • 回到这里是因为我在 3 年后发现了同样的问题......我看到的设置和我的设置之间的唯一区别是您使用“开始”而不是“舞蹈”。与 param: Foo 有什么关系?
【解决方案2】:

1。确保读取配置文件

我唯一的建议是

  1. 确保您已安装 YAML 模块。
  2. 检查配置文件上的权限 - 即运行脚本的用户是否具有读取权限。
  3. 检查配置文件的位置和名称。它应该是以下之一:a) appdir/config.yml、b) appdir/environments/development.yml 或 c) appdir/environments/production.yml(其中appdir 是您的 Dancer 应用程序所在的位置)。请参阅here 了解更多信息。

你也提到你

尝试使用 JSON 配置选项。

我不确定你的意思。 (配置文件是用 YAML 编写的,而不是 JSON。)

2。日志配置

你在上面写了

我还尝试了此测试中的代码并逐字复制(在设置引擎和小写文件之后设置记录器是唯一的区别)

我认为这可能是您的问题之一。如果您以编程方式设置配置(即不在配置文件中),请尝试放置

set logger => 'File';

之后

set engines => { ...`

即,而不是

set logger => 'File';
set engines => {
    logger => {
        File => {
            log_dir => $log_dir,
            log_level => $log_level,
            file_name => $log_filename,
        }
    }
};

尝试以下操作。

set engines => {
    logger => {
        File => {
            log_dir => $log_dir,
            log_level => $log_level,
            file_name => $log_filename,
        }
    }
};
set logger => 'File';

第二种方法对我有用。前者没有。

1https://metacpan.org/pod/Dancer2::Manual#CONFIGURATION.

【讨论】:

  • 感谢您的回答,但它也不起作用。事实上,那是我最后一次测试,只是我使用了“文件”而不是“文件”。我已将 Perl 升级到 5.24,将 Dancer2 升级到 v0.205002,但没有任何乐趣。有什么版本魔法发生了吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多