在项目上,我用NLog替换了Serilog。在 Serilog 中,我可以使用自己的过滤器为单独的项目创建多个子日志。这是我的配置:
Log.Logger = new LoggerConfiguration()
.Enrich.FromLogContext()
.WriteTo.File(...filapath...)
.WriteTo.Logger(l => l
.Filter.ByIncludingOnly(Matching.FromSource<ExceptionMiddleware>())
.WriteTo.Email(new EmailConnectionInfo()
{
FromEmail = fromEmail,
ToEmail = toEmail,
EmailSubject = subject,
NetworkCredentials = credentials,
Port = port,
MailServer = mailServer,
}))
.WriteTo.Logger(l => l
.Filter.ByIncludingOnly(Matching.FromSource("SomeProjectName"))
.WriteTo.File(anotherFilePath)
.WriteTo.Email(new EmailConnectionInfo()
{
FromEmail = fromEmail,
ToEmail = toEmail,
EmailSubject = subject,
NetworkCredentials = credentials,
Port = port,
MailServer = mailServer,
}, restrictedToMinimumLevel: LogEventLevel.Error,
outputTemplate:
"{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Level}] {Message}{NewLine}{NewLine}{Exception}"))
.CreateLogger();
如何在 NLog 中实现此功能?这是我当前的文件配置:
<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<extensions>
<add assembly="NLog.Extended" />
</extensions>
<extensions>
<add assembly="NLog.MailKit" />
</extensions>
<extensions>
<add assembly="NLog.Web" />
</extensions>
<extensions>
<add assembly="NLog.Web.AspNetCore" />
</extensions>
<variable name="smtp-server" value="smtp-server" />
<variable name="smtp-port" value="port" />
<variable name="smtp-password" value="password" />
<variable name="smtp-authentication" value="Basic" />
<variable name="smtp-ssl" value="ssl" />
<variable name="smtp-username" value="username" />
<variable name="smtp-from" value="from" />
<variable name="smtp-to" value="to" />
<targets>
<target name="fileLogs"
xsi:type="File"
fileName="${currentdir}/Logs/log.txt"
createDirs="True" />
<target name="mailLogs" xsi:type="Mail"
subject="subject}"
body="${message}${newline}"
from="${smtp-from}"
to="${smtp-to}"
smtpUsername="${smtp-username}"
secureSocketOption="sslOnConnect"
enableSsl="${smtp-ssl}"
smtpPassword="${smtp-password}"
smtpAuthentication="${smtp-authentication}"
smtpServer="${smtp-Server}"
smtpPort="${smtp-port}" />
</targets>
<rules>
<logger name="*" levels="Info,Error" writeTo="consoleLogs" />
<logger name="*" levels="Info,Debug,Error" writeTo="fileLogs" />
<logger name="*" minlevel="Error" writeTo="mailLogs" />
</rules>
</nlog>
我正在尝试创建 subloger 的替代方案,类似于 NLog 中的 Serilog 功能。更准确地说,我正在尝试为 SomeProjectName 创建单独的目标 - 文件、邮件。
您看到
<logger>
标签中的星号了吗? <logger name="*" .../>
。这些就是您正在寻找的过滤器。代码中的每个 Logger
对象都有一个名称。使用 LogManager.GetCurrentClassLogger()
创建的记录器具有创建对象的类的名称,包括命名空间。但您可以改为调用 LogManager.GetLogger(string)
,并选择任何字符串作为名称。过滤器从头到尾解析,如果过滤器与 final
属性设置为 true 匹配,则可以停止搜索。因此,您在代码中创建一个特殊的记录器:
var log = LogManager.GetLogger("Special");
您可以在配置中使用它,如下所示(确保它位于所有其他规则之前):
<logger name="Special" final="true" writeTo="specialLogFile"/>
其中“specialLogFile”在
<targets>
部分定义。
在大多数情况下,记录器名称和日志级别足以过滤所有日志。但还有更强大的过滤功能,具有
<filter>
部分和 <when>
条件。从这里开始了解更多信息。