NLog 子日志替代品

问题描述 投票:0回答:1

在项目上,我用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 创建单独的目标 - 文件、邮件。

c# .net nlog
1个回答
1
投票

您看到

<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>
条件。从这里开始了解更多信息。

© www.soinside.com 2019 - 2024. All rights reserved.