【发布时间】:2016-03-09 06:41:13
【问题描述】:
我正在尝试为 log4net 创建一个 Helper 类,它将我的所有消息记录到日志文件中。
该解决方案由一个 MVC Web 应用程序和 2 个 Windows 服务组成。我希望能够为所有三个项目使用相同的记录器类。
我正在创建的 Helper 类位于 Common Project 中。
这是类的样子:
public class TBLogger
{
private static ILog Logger;
public ILog Log
{
get
{
if (Logger != null) return Logger;
XmlConfigurator.Configure();
var type = MethodBase.GetCurrentMethod().DeclaringType;
Logger = LogManager.GetLogger(type);
return Logger;
}
}
public void LogMessage(MessageType messageType, string message)
{
switch (messageType)
{
case MessageType.Debug:
Log.Debug(message);
break;
case MessageType.Information:
Log.Info(message);
break;
case MessageType.Error:
Log.Error(message);
break;
}
}
public void LogExceptionMessage(string message, Exception innerException, string stackTrace, int iStage)
{
var exceptionMessage = string.Format("iStage: [{0}] Exception: [{1}], Inner: [{2}], Stack Trace: [{3}]", iStage, message, innerException.Message, stackTrace);
Log.Error(exceptionMessage);
}
}
我已经在 Assembly Class 中添加了 Log4net 设置
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "Log4net.config", Watch = true)]
配置文件如下所示: (MVC 应用程序的 web.config 和服务的 App.config)
<log4net file="Log4net.config" />
Log4net.config 是这样的:
<log4net>
<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
<lockingModel type="log4net.Appender.FileAppender+MinimalLock"/>
<file value="D:\MyPath\Logs\WebLogs\" />
<datePattern value="dd-MMM-yyyy\\\\'GeneralLog.txt'" />
<staticLogFileName value="false" />
<appendToFile value="true" />
<rollingStyle value="Composite" />
<layout type="log4net.Layout.PatternLayout">
<!--<conversionPattern value="%date{MM/dd/yy HH:mm} [%thread] %-5level - %message%newline" />-->
<conversionPattern value="%date{MM/dd/yy HH:mm} %-5level - %message%newline" />
</layout>
<filter type="log4net.Filter.LevelRangeFilter">
<levelMin value="INFO" />
<levelMax value="INFO" />
</filter>
</appender>
<root>
<appender-ref ref="RollingLogFileAppender" />
</root>
</log4net>
我要做的是创建一个 TBLogger 对象并从 Windows 服务和 MVC 应用程序调用 LogMessage 函数。
var logger = new TBLogger();
logger.LogMessage(MessageType.Information, "This is Information");
但它似乎不起作用。
编辑
log4net 调试文件提供了以下信息:
log4net: log4net assembly [log4net, Version=1.2.15.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a]. Loaded from [C:\Users\[]\AppData\Local\Temp\Temporary ASP.NET Files\vs\bc22238d\7aa91eba\assembly\dl3\c228fa05\4ec3fa68_5175d101\log4net.dll]. (.NET Runtime [4.0.30319.42000] on Microsoft Windows NT 10.0.10240.0)
log4net: defaultRepositoryType [log4net.Repository.Hierarchy.Hierarchy]
log4net: Creating repository for assembly [DotNetOpenAuth.Core, Version=4.3.0.0, Culture=neutral, PublicKeyToken=2780ccd10d57b246]
log4net: Assembly [DotNetOpenAuth.Core, Version=4.3.0.0, Culture=neutral, PublicKeyToken=2780ccd10d57b246] Loaded From [C:\Users\[]\AppData\Local\Temp\Temporary ASP.NET Files\vs\bc22238d\7aa91eba\assembly\dl3\a73bdbf7\3acfe046_5175d101\DotNetOpenAuth.Core.dll]
log4net: Assembly [DotNetOpenAuth.Core, Version=4.3.0.0, Culture=neutral, PublicKeyToken=2780ccd10d57b246] does not have a RepositoryAttribute specified.
log4net: Assembly [DotNetOpenAuth.Core, Version=4.3.0.0, Culture=neutral, PublicKeyToken=2780ccd10d57b246] using repository [log4net-default-repository] and repository type [log4net.Repository.Hierarchy.Hierarchy]
log4net: Creating repository [log4net-default-repository] using type [log4net.Repository.Hierarchy.Hierarchy]
log4net: Creating repository for assembly [Common, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]
log4net: Assembly [Common, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null] Loaded From [C:\Users\[]\AppData\Local\Temp\Temporary ASP.NET Files\vs\bc22238d\7aa91eba\assembly\dl3\e7a0face\f76e0d4c_cf79d101\Common.dll]
log4net: Assembly [Common, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null] does not have a RepositoryAttribute specified.
log4net: Assembly [Common, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null] using repository [log4net-default-repository] and repository type [log4net.Repository.Hierarchy.Hierarchy]
log4net: repository [log4net-default-repository] already exists, using repository type [log4net.Repository.Hierarchy.Hierarchy]
log4net: configuring repository [log4net-default-repository] using .config file section
log4net: Application config file is [C:..........\web.config]
log4net: Configuring Repository [log4net-default-repository]
log4net: Configuration update mode [Merge].
log4net: Hierarchy Threshold []
log4net: No appenders could be found for logger [Common.Constants.TBLogger] repository [log4net-default-repository]
log4net: Please initialize the log4net system properly.
log4net: Current AppDomain context information:
log4net: BaseDirectory : C:\.............\
log4net: FriendlyName : /LM/W3SVC/2/ROOT-1-131019801091897637
log4net: DynamicDirectory: C:\Users\[]\AppData\Local\Temp\Temporary ASP.NET Files\vs\bc22238d\7aa91eba
编辑 2: 当我将这些行添加到 Global.asax.cs
时,它适用于 MVC 应用程序var l4net = Server.MapPath("~/Log4net.config");
log4net.Config.XmlConfigurator.ConfigureAndWatch(new FileInfo(l4net));
【问题讨论】:
-
@UweKeim 我已经在问题中发布了 log4net 调试文件信息
-
我只能假设您的初始配置文件声明使 log4net 查找错误的路径。如果它没有找到配置文件,它不会做任何日志记录。您可以将您的 log4net 配置添加到您的 web.config。
-
@DirkTrilsbeek 当我在 Web.config 或 App.config 文件中添加 Log4net 设置时,你是对的。