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 查看日志。
我已经在 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 查看日志。