【发布时间】:2017-11-13 14:28:51
【问题描述】:
我有一个将其日志发送到 NLog 的 ASP.NET 项目。
但是在这个项目中,我有自己的 NLog 记录器,我想知道如何通过它路由所有日志。
我想我不应该将 NLog 添加为记录器,但我应该找到一种方法来注册每次 ASP 尝试记录任何内容时都会调用的方法。
如何做到这一点?
这是创建记录器的代码:
// create the module name
var ProcessName = Process.GetCurrentProcess().ProcessName;
_ModuleName = ProcessName + " (\"" + Oracle.GuessMyName() + "\")";
// create the logger configuration
var Configuration = new LoggingConfiguration();
// create the file target
var FileTarget = new FileTarget ("file")
{
FileName = @"x:\Logs\${processname}.log",
ArchiveFileName = @"x:\Logs\${processname}.{#}.log",
Layout = @"${longdate}|${logger}|${level}|${message}${onexception:|Exception occurred:${exception:format=tostring}${newline}",
ArchiveEvery = FileArchivePeriod.Day,
ArchiveNumbering = ArchiveNumberingMode.Rolling,
MaxArchiveFiles = 7,
ConcurrentWrites = true
};
Configuration.AddTarget(FileTarget);
// create the viewer target
var ViewerTarget = new NLogViewerTarget ("viewer")
{
Layout = @"${message}${onexception:${newline} --> Exception occurred\:${exception:format=tostring}",
IncludeSourceInfo = true,
IncludeCallSite = true,
Address = @"udp://127.0.0.1:9999"
};
Configuration.AddTarget(ViewerTarget);
// set the rules
Configuration.LoggingRules.Add(new LoggingRule("*", LogLevel.Info, FileTarget));
Configuration.LoggingRules.Add(new LoggingRule("*", LogLevel.Info, ViewerTarget));
// set the configuration
LogManager.Configuration = Configuration;
// create a new logger
_Logger = LogManager.GetLogger(_ModuleName);
这也是 ASP.net 连接到 nlog 的方式:
LoggerFactory.AddNLog();
Application.AddNLogWeb();
现在两个进程的当前日志布局看起来像这样(每次重新启动进程时动物名称都会自动更改)
所以这两个进程:shinobi 和 mouserun 这里都有自己的日志输出,但是任何与 ASP 相关的内容都会转到名为 Microsoft 的 ASP 的 nlog 实例,而不管进程如何。
目标是让 shinobi 的 ASP 输出进入 shinobi 记录器,而 mouserun ASP 输出进入 mouserun 记录器。
【问题讨论】:
-
不,我希望从 Shinobi 进程到 Microsoft 的任何东西都转到 Shinobi 记录器,从 Mouserun 到 Microsoft 的任何东西都转到 Mouserun 进程。我不希望 ASP 记录到 nlog,我希望 ASP 在它想要记录某些内容时给我一个回调,以便我可以写入进程的记录器
-
添加所以它是包含一个记录器名称的 Log4J XML 输出,您以某种方式配置了所有内容。文件目标工作正常。
-
是的,文件输出工作正常,但 UDP 不是
-
没有办法改变逻辑以使用 NLogViewerTarget.Parameters 注入全局应用程序名称,然后在查看器中从 Log4J XML 中提取它吗?也许将其作为覆盖,因此如果全局应用程序参数元素存在则使用它,否则它会回退到记录器元素。
-
没有实用的方法来做到这一点;最简单的可能是删除 ASP/Nlog 集成,然后为日志创建一个 ASP 中间件,该中间件将写入进程的记录器(至少从我在谷歌上看到的,这似乎是最直接的)