NLog:根据记录器名称和分组 Quartz 日志写入两个不同的目标
NLog: Write to two different targets based on logger name and grouping Quartz logs
我有一个 ASP.NET 4.7 网络项目,其中实施了 Quartz.NET 调度程序。
我读到 Quartz.NET 正在使用 Common.Logging 抽象,但我不知道它的真正含义...
为了避免我的默认应用程序日志被 Quartz 消息垃圾邮件,我以编程方式配置了 NLog 设置,如下所示:
var config = new NLog.Config.LoggingConfiguration();
var logfile = new NLog.Targets.FileTarget("logfile")
{
FileName = "${basedir}/Logs/${logger}_${shortdate}.log",
Layout = "${longdate}|${level:uppercase=true}|${aspnet-request-ip}|${aspnet-request-url}|${callsite}|${message}|${exception:format=tostring}"
};
var logfileQ = new NLog.Targets.FileTarget("logfile")
{
FileName = "${basedir}/Logs/Quartz_${shortdate}.log",
Layout = "${longdate}|${level:uppercase=true}||${message}"
};
config.AddTarget(logfile);
config.AddTarget(logfileQ);
config.AddRule(LogLevel.Error, LogLevel.Fatal, logfileQ, "Quartz*", true);
config.AddRule(LogLevel.Trace, LogLevel.Fatal, logfile, "*");
// Apply config
NLog.LogManager.Configuration = config;
NLog.LogManager.ReconfigExistingLoggers();
然后我使用以下代码添加我的应用程序日志:
public class MyApiController : ApiController
{
private static NLog.Logger logger = NLog.LogManager.GetLogger("Application");
[HttpPost]
[Authorize]
public IHttpActionResult Post(DataModel.MyModel m)
{
logger.Warn("Unable to add point {0}: localization missing", m.Name);
}
}
因此 NLog 正确地创建了一个 "application_yyyy-MM-dd.log" 文件以及一个仅包含错误和致命消息级别的 "Quartz_yyyy-MM-dd.log" 文件。
问题是它还为包含所有级别的 Quartz 创建了以下三个文件:
- Quartz.Core.JobRunShell_2020-04-28.log
- Quartz.Core.QuartzSchedulerThread_2020-04-28.log
- Quartz.Simpl.SimpleJobFactory_2020-04-28.log
第一条规则的 final=true 似乎被忽略了。
哪种配置方式正确?我应该在 Quartz 中禁用某些东西吗?
终于想通了
添加的规则必须被视为过滤器,不符合过滤器的进入下一条规则。
最后一个像"take everything that has not been matching before..."
我的规则中的主要问题是第一个只匹配错误和致命级别,但所有其他级别的 Quartz 消息都会进入写入日志文件的下一个规则。
因此规则应该是这样的:
config.AddRule(LogLevel.Trace, LogLevel.Fatal, logfileQ, "Quartz*", true);
config.AddRule(LogLevel.Trace, LogLevel.Fatal, logfile, "*");
这样,来自Quartz的任何级别的所有消息都将写入quartz_日志文件。
为了避免记录 Quartz 的跟踪或信息级别,我应该添加第三条规则来抓取它们并放置在 "grab all" 规则之前:
config.AddRule(LogLevel.Warn, LogLevel.Fatal, logfileQ, "Quartz*", true);
config.AddRule(LogLevel.Trace, LogLevel.Info, noLogging, "Quartz*", true);
config.AddRule(LogLevel.Trace, LogLevel.Fatal, logfile, "*");
其中 noLogging 是一个不写入任何地方或只写入控制台的目标
我有一个 ASP.NET 4.7 网络项目,其中实施了 Quartz.NET 调度程序。 我读到 Quartz.NET 正在使用 Common.Logging 抽象,但我不知道它的真正含义...
为了避免我的默认应用程序日志被 Quartz 消息垃圾邮件,我以编程方式配置了 NLog 设置,如下所示:
var config = new NLog.Config.LoggingConfiguration();
var logfile = new NLog.Targets.FileTarget("logfile")
{
FileName = "${basedir}/Logs/${logger}_${shortdate}.log",
Layout = "${longdate}|${level:uppercase=true}|${aspnet-request-ip}|${aspnet-request-url}|${callsite}|${message}|${exception:format=tostring}"
};
var logfileQ = new NLog.Targets.FileTarget("logfile")
{
FileName = "${basedir}/Logs/Quartz_${shortdate}.log",
Layout = "${longdate}|${level:uppercase=true}||${message}"
};
config.AddTarget(logfile);
config.AddTarget(logfileQ);
config.AddRule(LogLevel.Error, LogLevel.Fatal, logfileQ, "Quartz*", true);
config.AddRule(LogLevel.Trace, LogLevel.Fatal, logfile, "*");
// Apply config
NLog.LogManager.Configuration = config;
NLog.LogManager.ReconfigExistingLoggers();
然后我使用以下代码添加我的应用程序日志:
public class MyApiController : ApiController
{
private static NLog.Logger logger = NLog.LogManager.GetLogger("Application");
[HttpPost]
[Authorize]
public IHttpActionResult Post(DataModel.MyModel m)
{
logger.Warn("Unable to add point {0}: localization missing", m.Name);
}
}
因此 NLog 正确地创建了一个 "application_yyyy-MM-dd.log" 文件以及一个仅包含错误和致命消息级别的 "Quartz_yyyy-MM-dd.log" 文件。
问题是它还为包含所有级别的 Quartz 创建了以下三个文件:
- Quartz.Core.JobRunShell_2020-04-28.log
- Quartz.Core.QuartzSchedulerThread_2020-04-28.log
- Quartz.Simpl.SimpleJobFactory_2020-04-28.log
第一条规则的 final=true 似乎被忽略了。
哪种配置方式正确?我应该在 Quartz 中禁用某些东西吗?
终于想通了
添加的规则必须被视为过滤器,不符合过滤器的进入下一条规则。
最后一个像"take everything that has not been matching before..."
我的规则中的主要问题是第一个只匹配错误和致命级别,但所有其他级别的 Quartz 消息都会进入写入日志文件的下一个规则。
因此规则应该是这样的:
config.AddRule(LogLevel.Trace, LogLevel.Fatal, logfileQ, "Quartz*", true);
config.AddRule(LogLevel.Trace, LogLevel.Fatal, logfile, "*");
这样,来自Quartz的任何级别的所有消息都将写入quartz_日志文件。
为了避免记录 Quartz 的跟踪或信息级别,我应该添加第三条规则来抓取它们并放置在 "grab all" 规则之前:
config.AddRule(LogLevel.Warn, LogLevel.Fatal, logfileQ, "Quartz*", true);
config.AddRule(LogLevel.Trace, LogLevel.Info, noLogging, "Quartz*", true);
config.AddRule(LogLevel.Trace, LogLevel.Fatal, logfile, "*");
其中 noLogging 是一个不写入任何地方或只写入控制台的目标