感谢 TurboAI对本博客的的大力赞助。 创作不易,如果您觉得有帮助,请 支持LIncol29! 为了让我能够继续创作更好的内容,你也可以选择订阅博客的 VIP ,包年VIP仅需10元/年,所有VIP内容免费观看
log4net介绍
Log4net是一个功能强大的日志记录库,广泛用于C#开发中。它允许开发者灵活地记录应用程序的运行信息,有助于调试和性能监控。使用Log4net的主要原因包括:
- 灵活配置:支持XML和代码配置,可以根据需求调整日志级别和输出格式。
- 多种输出方式:可以将日志输出到控制台、文件、数据库等多种目标,方便信息收集。
- 性能优化:异步记录和日志级别管理,确保应用程序性能不受影响。
引用log4net.dll文件
项目引用dll文件,或者自己打包log4net 。
- 在Nuget项目包管理里面添加
log4net
包 - 直接使用
lincol
提供的 dll文件,地址如下:log4net.dll
添加log4net.config配置文件
在项目添加程序配置文件: log4net.config
。
文件复制到输出目录要选择:设置为“始终复制”或“如果更新则复制”。这样子才可以让软件找到此文件。
log4net.config
配置如下,直接 copy 即可
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<log4net>
<!--错误日志类-->
<logger name="logerror">
<!--日志类的名字-->
<level value="ALL" />
<!--定义记录的日志级别-->
<appender-ref ref="ErrorAppender" />
<!--记录到哪个介质中去-->
</logger>
<!--信息日志类-->
<logger name="loginfo">
<level value="ALL" />
<appender-ref ref="InfoAppender" />
</logger>
<!--错误日志附加介质-->
<appender name="ErrorAppender" type="log4net.Appender.RollingFileAppender">
<!-- name属性指定其名称,type则是log4net.Appender命名空间的一个类的名称,意思是,指定使用哪种介质-->
<param name="File" value="Log\\LogError\\" />
<!--日志输出到exe程序这个相对目录下-->
<param name="AppendToFile" value="true" />
<!--输出的日志不会覆盖以前的信息-->
<param name="MaxSizeRollBackups" value="100" />
<!--备份文件的个数-->
<param name="MaxFileSize" value="10240" />
<!--当个日志文件的最大大小-->
<param name="StaticLogFileName" value="false" />
<!--是否使用静态文件名-->
<param name="DatePattern" value="yyyyMMdd".htm"" />
<!--日志文件名-->
<param name="RollingStyle" value="Date" />
<!--文件创建的方式,这里是以Date方式创建-->
<!--错误日志布局-->
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="<HR COLOR=red>%n异常时间:%d [%t] <BR>%n异常级别:%-5p <BR>%n异 常 类:%c [%x] <BR>%n%m <BR>%n <HR Size=1>" />
</layout>
</appender>
<!--信息日志附加介质-->
<appender name="InfoAppender" type="log4net.Appender.RollingFileAppender">
<param name="File" value="Log\\LogInfo\\" />
<param name="AppendToFile" value="true" />
<param name="MaxFileSize" value="10240" />
<param name="MaxSizeRollBackups" value="100" />
<param name="StaticLogFileName" value="false" />
<param name="DatePattern" value="yyyyMMdd".htm"" />
<param name="RollingStyle" value="Date" />
<!--信息日志布局-->
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="<HR COLOR=blue>%n日志时间:%d [%t] <BR>%n日志级别:%-5p <BR>%n日 志 类:%c [%x] <BR>%n%m <BR>%n <HR Size=1>" />
</layout>
</appender>
</log4net>
</configuration>
使用LogHelper类
public class LogHelper
{
public static readonly log4net.ILog loginfo = log4net.LogManager.GetLogger("loginfo");
public static readonly log4net.ILog logerror = log4net.LogManager.GetLogger("logerror");
public static void LogErr(string info)
{
logerror.Error(info);
}
public static void LogTrace(string info)
{
loginfo.Debug("trace: " + info);
}
public static void WriteLog(string info)
{
if (loginfo.IsInfoEnabled)
{
loginfo.Info(info);
}
}
public static void SetConfig()
{
var path = new FileInfo("log4net.config");
//Console.Write(path);
log4net.Config.XmlConfigurator.Configure(path);
logerror.Info("Enter application.");
loginfo.Info("Enter application.");
}
/// <summary>
/// 删除N天之前的日志
/// </summary>
/// <param name="n"></param>
public static void DeleteLogBeforeN(int n)
{
DateTime nowTime = DateTime.Now;
string[] pcfiles = Directory.GetFiles(System.Environment.CurrentDirectory + @".\\Log\\LogInfo");
string[] robotfiles = Directory.GetFiles(System.Environment.CurrentDirectory + @".\\IPCLog");
foreach (string file in pcfiles)
{
FileInfo fileInfo = new FileInfo(file);
string pcdata = fileInfo.Name.Substring(0, 8);
DateTime filedate = DateTime.ParseExact(pcdata, "yyyyMMdd", null);
TimeSpan t = DateTime.Now - filedate; //当前时间 减去 文件创建时间
int day = t.Days;
if (day > n) //保存的时间,单位:天
{
if (IsOccupy(fileInfo.FullName)) //判断文件是否被占用
{
System.IO.File.Delete(fileInfo.FullName); //删除文件
}
else
{
LogHelper.loginfo.Error("当前日志文件被占用,无法操作!");
}
}
}
foreach (string file in robotfiles)
{
FileInfo fileInfo = new FileInfo(file);
string robotdata = fileInfo.Name.Substring(4, 10);
DateTime filedate = DateTime.ParseExact(robotdata, "yyyy-MM-dd", null);
TimeSpan t = DateTime.Now - filedate; //当前时间 减去 文件创建时间
int day = t.Days;
if (day > n) //保存的时间,单位:天
{
if (IsOccupy(fileInfo.FullName)) //判断文件是否被占用
{
System.IO.File.Delete(fileInfo.FullName); //删除文件
}
else
{
LogHelper.loginfo.Error("文件被占用,无法操作!");
}
}
}
}
[DllImport("kernel32.dll")]
public static extern IntPtr _lopen(string lpPathName, int iReadWrite);
[DllImport("kernel32.dll")]
public static extern bool CloseHandle(IntPtr hObject);
public const int OF_READWRITE = 2;
public const int OF_SHARE_DENY_NONE = 0x40;
public static readonly IntPtr HFILE_ERROR = new IntPtr(-1);
private static bool IsOccupy(string file)
{
bool result = true; //默认状态此文件未被占用
try
{
//string vFileName = @"c:\temp\temp.bmp";
string vFileName = file;
if (!System.IO.File.Exists(vFileName))
{
//Logger.Info("文件都不存在!");
result = false;
}
IntPtr vHandle = _lopen(vFileName, OF_READWRITE | OF_SHARE_DENY_NONE);
if (vHandle == HFILE_ERROR)
{
LogHelper.loginfo.Error("文件被占用!");
result = false;
}
CloseHandle(vHandle);
}
catch (Exception err)
{
result = false;
LogHelper.loginfo.Error(err);
}
return result;
}
public static void WriteLog(string info, Exception ex)
{
if (logerror.IsErrorEnabled)
{
logerror.Error(info, ex);
}
}
主窗口Load事件加入初始化日志
在想使用的地方(建议主窗口)。窗口Load事件加入此代码: LogHelper.SetConfig();
初始化配置文件
调用LogHelper方法
建议直接使用 loginfo
或者 logerror
的方法
public static readonly log4net.ILog loginfo = log4net.LogManager.GetLogger("loginfo");
public static readonly log4net.ILog logerror = log4net.LogManager.GetLogger("logerror");
例如直接使用
LogHelper.loginfo.Debug("软件关闭!!!");
假设每个日志文件每天10MB 100天就是1GB 如果运行几年 日志会占据很多空间 而且没压缩的文件体积大 备份和传输都很麻烦哦
LogHelper里面有DeleteLogBeforeN,设置时间自动清理就可以啦