DotNetCore App log4net 在通过 systemd 启动时不记录

DotNetCore App log4net not logging when started via systemd

我已经在 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

正在相应地创建应用 运行s 和日志文件。

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

drwxrw-rw- 2 normaluser normaluser

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

二手 hardware/software:

Linux = Raspbian GNU/Linux 9(拉伸)

.Net-Core = Microsoft.NETCore.App 3.1.9

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

我还认为您可能希望在您的单元文件中指定一个工作目录。这样,如果您将 Log4Net 的文件附加程序配置为登录到 Logs/Service.log.txt,那么您应该会看到在 $WorkingDirectory.

中创建的 Logs 文件夹

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