我有一个应用程序,包含多个部分。
我自始至终都在使用log4net记录事件,我希望这些事件有一个与它们来自何处的源相匹配的源(您知道" SOURCE“意味着什么)。因此,我在“应用程序和服务日志”下有一个日志,并按照您的预期设置了log4net。

在log4net中,配置中有一个元素"applicationName“,该元素根据文档指定”将存储消息的日志的名称“。
文档中的示例显示
<applicationName value="MyApp" />Log4Net使用来自"applicationName“的值来记录事件。根据log4net源代码中的文档,应该使用"ApplicationName属性来区分事件“。
因此,假设LogName设置正确,我希望在事件查看器中看到“应用程序和服务日志”下的"LogName“,然后只需设置applicationName就可以得到正确的源代码。但是,applicationName似乎只在配置中设置.但这意味着所有事件都记录在同一个源中:

如何设置源名.?有别的办法吗?
发布于 2016-04-17 15:47:44
我没有找到答案,所以我下载了log4net的源代码,并决定找出答案。
下面的代码片段将ApplicationName设置为log4net
private static void SetEventSource(string sourceName)
{
var repository = LogManager.GetRepository();
if (repository != null)
{
var appender = repository.GetAppenders().Where(x => x.Name == "eventLogAppender").FirstOrDefault();
if (appender is log4net.Appender.EventLogAppender)
{
var eventAppender = (log4net.Appender.EventLogAppender)appender;
eventAppender.ApplicationName = sourceName;
eventAppender.ActivateOptions();
}
}
}我有一个"LoggingSources“的枚举,所以当应用程序开始确保日志源存在时,我只需要循环一遍。
public static void ConfigureWindowsEvents()
{
// Create event log sources for each of our Logging types
var loggingEvents = Enum.GetValues(typeof(LoggingSources));
foreach (var item in loggingSources)
{
string source = item.ToString();
if (!EventLog.SourceExists(source))
{
EventLog.CreateEventSource(source, EVENT_LOG_NAME);
}
}
}然后,当我记录一个事件时,我会设置源和事件id。
public static void SetThreadContextAndLog(LoggingSources eventId, Action logAction)
{
if (logAction != null)
{
log4net.ThreadContext.Properties[EVENT_ID_KEY] = (int)eventId;
try
{
SetEventSource(eventId.ToString());
logAction();
}
finally
{
log4net.ThreadContext.Properties[EVENT_ID_KEY] = DEFAULT_EVENT_ID;
}
}
}按以下方式调用该方法..。
public static void LogEvent(LoggingSources pEvent, string pMessage, EventLogEntryType pEventType)
{
SetThreadContextAndLog(pEvent, () =>
{
if (pEventType == EventLogEntryType.Warning)
{
Log.Warn(pMessage);
}
});
}这将导致正确设置源和事件id .

这有点像faff,但是我看不出一种更整洁的方式来设置日志源而不创建一个自定义的附录.
https://stackoverflow.com/questions/36678685
复制相似问题