尽管被接受的答案在大多数情况下是有效的,但它有一些缺点。
- 它只保留最后5个日志。
- 日志大小设置为1GB,对于大多数记事本应用程序来说太大了。
- 由于它锁定了日志文件,因此不适合于多线程应用程序,如Web应用程序。
- 由于日期被添加到文件名前缀中,在Windows中使用不方便
- 每次应用程序重新启动时,它都会覆盖日志,这对于您打算保留日志是不合适的。
- 正如评论中提到的那样,它需要进行一些修改才能在某些情况下正确工作。
因此需要更详细的配置。我创建了一个类,使记录日志变得更加容易。当然,如果您希望,您可以只选择配置部分。
using log4net;
using log4net.Appender;
using log4net.Config;
using log4net.Core;
using log4net.Layout;
using log4net.Repository.Hierarchy;
using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Text;
using System.Web;
public enum LogType { Info, Debug, Warn, Error, Fatal };
public class Logger {
private const string LOG_NAMESPACE = "APP_NAME";
private const string LOG_FILENAME_PREFIX = @"D:\Logs\";
private static readonly Level LOG_LEVEL = Level.Debug;
private static readonly ILog log = LogManager.GetLogger(LOG_NAMESPACE);
#region static Logger()
static Logger() {
Hierarchy hierarchy = (Hierarchy) LogManager.GetRepository();
hierarchy.Root.RemoveAllAppenders();
hierarchy.Root.Level = LOG_LEVEL;
PatternLayout layout = new PatternLayout() { ConversionPattern = "%d{yyyy-MM-dd HH:mm:ss.fff} %4t %-5p %m%n" };
layout.ActivateOptions();
RollingFileAppender RFA = new RollingFileAppender();
RFA.Name = LOG_NAMESPACE;
RFA.File = LOG_FILENAME_PREFIX + LOG_NAMESPACE;
RFA.LockingModel = new FileAppender.MinimalLock();
RFA.AppendToFile = true;
RFA.DatePattern = ".yyyy.MM.dd'.log'";
RFA.Encoding = Encoding.UTF8;
RFA.CountDirection = 1;
RFA.MaximumFileSize = "100MB";
RFA.RollingStyle = RollingFileAppender.RollingMode.Composite;
RFA.StaticLogFileName = false;
RFA.MaxSizeRollBackups = -1;
RFA.PreserveLogFileNameExtension = true;
RFA.Layout = layout;
RFA.ActivateOptions();
hierarchy.Root.AddAppender(RFA);
BasicConfigurator.Configure(hierarchy);
}
#endregion
#region public static int Log(...)
public static void Log(string Description, LogType logtype = LogType.Info) {
switch (logtype) {
case LogType.Debug:
log.Debug(Description);
break;
case LogType.Info:
log.Info(Description);
break;
case LogType.Warn:
log.Warn(Description);
break;
case LogType.Error:
log.Error(Description);
break;
case LogType.Fatal:
log.Fatal(Description);
break;
}
}
#endregion
#region public static int Log(...)
public static void Log(string Message, Exception ex) {
log.Fatal(Message, ex);
}
#endregion
}
然后,要记录消息和异常,请按以下方式调用它。
Logger.Log("I was here", LogType.Debug);
Logger.Log("I am info message");
Logger.Log("An error", LogType.Error);
Logger.Log("An Exception", ex);
由于log4net以奇怪的方式将滚动数据添加到文件名中(在文件扩展名后添加),因此文件会丢失Windows资源管理器关联。为了解决这个问题,将
.log
添加到DatePattern中。它还会在扩展名之前正确地添加文件增量(可能是因为一个错误)。测试版本为
1.2.11.0
。
注意事项:
- 不需要外部调用进行初始化,这将在应用程序启动时初始化(或者第一次调用Logger.Log时)。
- 您可以将所有类常量移出到自己的配置文件中,并使此类更加通用和可重用。
- 注意没有指定命名空间,这将使Logger类在所有命名空间中可用。
- Log4net提供了5种记录消息的方法,这有点不方便记忆。因此,默认情况下,
Logger.Log
方法使用
info
。
- 无关注:如果您的应用程序在服务器或Web上运行,请将日志文件保持在操作系统驱动器和应用程序文件夹之外。