我有一个ASP.NET 4.7 Web项目,其中实现了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创建了包含所有级别的以下三个文件:
似乎似乎忽略了第一条规则的final = true。
哪种是正确的配置方式?我是否应该禁用Quartz中的某些功能?
我终于知道了。
添加的规则必须被视为过滤器,与过滤器不匹配的将转到下一个规则。
最后一个就像“拿走之前没有匹配过的所有东西...”
[我的规则中的主要问题是,第一个仅与错误和致命级别匹配,但所有其他级别的Quartz消息都进入了下一个写入日志文件的规则。
因此规则应如下所示:
config.AddRule(LogLevel.Trace, LogLevel.Fatal, logfileQ, "Quartz*", true);
config.AddRule(LogLevel.Trace, LogLevel.Fatal, logfile, "*");
通过这种方式,来自Quartz的所有消息,无论级别如何,都将被写入crystal_log文件中。
为了避免记录石英的跟踪或信息级别,我应该添加第三条规则以同时捕获它们并将其放置在“全部抓取”规则之前:
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是不会在任何地方写入或仅向控制台写入的目标