【问题标题】:DotNetCore App log4net not logging when started via systemdDotNetCore App log4net 通过 systemd 启动时未记录
【发布时间】:2021-03-29 11:15:03
【问题描述】:

我在 Windows 上编写了一个 C# 应用程序,现在已将它部署在 Linux 上。当我以普通(无 sudo)用户身份通过​​终端启动应用程序时,log4net 工作正常。但是当我将应用程序设置为作为 systemd 运行时,应用程序正在运行,但日志记录功能却没有。

这里是我的 log4net.config:

<log4net>
  <root>
    <level value="INFO" />
  </root>
  <!-- myApp -->
  <logger name="myApp">
    <level value="DEBUG" />
    <appender-ref ref="app" />
  </logger>
  <appender name="app" type="log4net.Appender.RollingFileAppender">
    <file value="/var/client_name/log/myApp_v001/app.log" />
    <appendToFile value="true" />
    <rollingStyle value="Size" />
    <maxSizeRollBackups value="5" />
    <maximumFileSize value="10MB" />
    <staticLogFileName value="true" />
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date [%thread] %level - %message%newline" />
    </layout>
  </appender>
  <!-- ExternalLibrary -->
  <logger name="ExternalLibrary">
    <level value="WARN" />
    <appender-ref ref="extLib" />
  </logger>
  <appender name="extLib" type="log4net.Appender.RollingFileAppender">
    <file value="/var/client_name/log/myApp_v001/extLib.log" />
    <appendToFile value="true" />
    <rollingStyle value="Size" />
    <maxSizeRollBackups value="5" />
    <maximumFileSize value="10MB" />
    <staticLogFileName value="true" />
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date [%thread] %level %logger - %message%newline" />
    </layout>
  </appender>
</log4net>

在我的 C# 应用程序中,我正在设置 XmlConfigurator:

XmlConfigurator.Configure(logRepository, new FileInfo("log4net.config"));

在windows上,log4net在调试时将日志文件保存在c:/var/client_name/log/myApp_v001/*下

然后我发布了适用于 Linux 的应用程序并进行了部署。在 Linux 机器上,我在 /etc/systemd/system 下创建了一个 myApp.service 文件,内容如下:

[Unit]
Description=myApp Service
After=network.target remote-fs.target

[Service]
Type=simple
ExecStart=/opt/dotnet/dotnet /opt/client_name/myApp_v001/myApp.dll
ExecStartPre=/bin/sleep 10
Restart=always
User=normaluser
Group=normaluser

[Install]
WantedBy=multi-user.target

然后重启systemctl并手动启动服务:

sudo systemctl start myApp.service

应用程序运行并正在运行,但未创建日志文件。

然后我停止了服务

sudo systemctl stop myApp.service

并在没有 systemd 的情况下启动应用程序:

cd /opt/client_name/myApp_v001/
dotnet myApp.dll

应用程序运行并相应地创建日志文件。

包含日志的文件夹的权限设置为

drwxrw-rw- 2 normaluser normaluser

如何让记录器在由 systemd 启动时也能正常工作?

使用的硬件/软件:

Linux = Raspbian GNU/Linux 9(延伸)

.Net-Core = Microsoft.NETCore.App 3.1.9

【问题讨论】:

    标签: linux .net-core log4net systemd


    【解决方案1】:

    通过使日志路径相对,我让 log4net 与 dotnet core systemd 服务一起工作。

    我也相信您可能想在您的单元文件中指定一个工作目录。这样,如果您将 Log4Net 的文件附加程序配置为记录到 Logs/Service.log.txt,那么您应该会看到在 $WorkingDirectory 中创建的 Logs 文件夹。

    另一种选择是使用内置的 journalctl 来查看日志。

    【讨论】:

    • 在我的情况下,只需要在服务下的单元文件中设置工作目录。 WorkingDirectory=/opt/client_name/myApp_v001/ 并修改 ExecStart 以使用相对路径而不是绝对路径 ExecStart=/opt/dotnet/dotnet myApp.dll
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-26
    • 1970-01-01
    • 1970-01-01
    • 2010-09-14
    相关资源
    最近更新 更多