日志学习系列(二)——Log4net的实例
一、log4net简单实例创建步骤如下
1、第一步:在项目中添加对log4net.dll的引用,这里引用版本是2.0.8.0
2、第二步:程序启动时读取log4net的配置文件。
读取log4net的配置文件有两种方式
(1)如果是CS程序,在根目录的Program.cs中的Main方法中添加:log4net.Config.XmlConfigurator.Configure();
如果是BS程序,在根目录的Global.asax.cs(没有新建一个)中的Application_Start方法中添加:log4net.Config.XmlConfigurator.Configure();
(2)无论BS还是CS程序都可直接在项目的AssemblyInfo.cs文件里添加以下的语句:[assembly: log4net.Config .XmlConfigurator()]
3、第三步:在程序使用。
二、具体代码解析
1、建立日志级别枚举
public enum ELogLevel
{
/// <summary>
/// 错误信息
/// </summary>
Error = ,
/// <summary>
/// 跟踪信息
/// </summary>
Trace = ,
/// <summary>
/// 调试信息
/// </summary>
Debug = ,
/// <summary>
/// 记录信息
/// </summary>
Info =
}
2、定义ILog接口
public interface ILogger : IDisposable
{
void LogWithTime(string msg, ELogLevel logLevel = ELogLevel.Error);
bool Enabled { get; set; }
}
3、实现ILog接口并且通过代码读取log4net.xml
public class FileLogger : ILogger
{
private log4net.ILog _log = null;
private string _configLogLevel = null;
private bool _enabled = true; public FileLogger()
{
this._configLogLevel = GetAppSettingValue("LogLevel");
string logName = GetAppSettingValue("LogName");
string configPath = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "log4net.xml");
log4net.Config.XmlConfigurator.Configure(new FileInfo(configPath));
this._log = log4net.LogManager.GetLogger(logName);
}
/// <summary>
/// 获取AppSetting的值
/// </summary>
/// <returns></returns>
public static string GetAppSettingValue(string key)
{
string value = null;
foreach (string item in System.Configuration.ConfigurationManager.AppSettings)
{
if (item.Equals(key, StringComparison.CurrentCultureIgnoreCase))
{
value = System.Configuration.ConfigurationManager.AppSettings[key];
break;
}
}
return value;
} #region ILogger成员
public void LogWithTime(string msg, ELogLevel logLevel)
{
if (string.IsNullOrWhiteSpace(msg) || !this._enabled)
{
return;
}
#if DEBUG
Trace.TraceInformation(msg);
#endif
if (string.IsNullOrWhiteSpace(this._configLogLevel))
{
this._configLogLevel = ((int)ELogLevel.Error).ToString();
}
int configLogLevel = Convert.ToInt32(this._configLogLevel);
if ((int)logLevel <= configLogLevel)
{
try
{
switch (logLevel)
{
case ELogLevel.Error:
this._log.Error(msg);
break;
case ELogLevel.Trace:
this._log.Warn(msg);
break;
case ELogLevel.Debug:
this._log.Debug(msg);
break;
case ELogLevel.Info:
this._log.Info(msg);
break;
default:
break;
}
}
catch
{
}
}
} public bool Enabled
{
get { return this._enabled; }
set { this._enabled = value; }
}
#endregion #region IDisposable
public void Dispose()
{ }
#endregion
}
4、使用log4net
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
} private void btnLog4net_Click(object sender, EventArgs e)
{
ILogger _fileLogger = new FileLogger();
_fileLogger.LogWithTime("log4net 日志记录",ELogLevel.Info);
MessageBox.Show("生成的日志地址:"+System.AppDomain.CurrentDomain.BaseDirectory);
}
}
三、log4net.xml配置
<?xml version="1.0" encoding="utf-8" ?>
<log4net debug="true">
<appender name="FlatFile" type="log4net.Appender.RollingFileAppender,log4net">
<param name="File" value="logs/website.log" />
<param name="Encoding" value="utf-8" />
<param name="AppendToFile" value="true" />
<param name="RollingStyle" value="Date" />
<param name="ImmediateFlush" value="true" />
<param name="MaximumFileSize" value="50MB"/>
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
<param name="DatePattern" value="-yyyy.MM.dd'.log'" />
<param name="StaticLogFileName" value="true" />
<layout type="log4net.Layout.PatternLayout,log4net">
<param name="ConversionPattern" value="%-5level [%logger] - %message [%date] %newline" />
</layout>
</appender>
<root>
<priority value="DEBUG" />
<appender-ref ref="FlatFile" />
</root>
</log4net>
四、注意事项
在Debug模式一切正常,但是在release模式下log4net不工作,查了很多资料,终于解决。具体做如下检查修改。
1、检查log4net写入日志文件路径是否正确;
2、检查对应日志文件路径是否有权限;
3、检查程序log4net配置获取路径;
最常见的问题是第三步,一般都是在AssemblyInfo.cs文件中写入如下代码
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.xml", ConfigFileExtension = "xml", Watch = true)]
但这个方式在Debug模式下没有问题,但是在release模式下就不好用了,需要在Global.asax文件中具体再次指定配置文件所在位置,例如:
string configPath = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "log4net.xml");
log4net.Config.XmlConfigurator.Configure(new FileInfo(configPath));
重新编译发布就可以了。
下一篇介绍NLog日志
日志学习系列(二)——Log4net的实例的更多相关文章
- 日志学习系列(一)——Log4net的基础知识学习
今天把Log4net日志记录做了封装,作为一个公共的类库.记录一下应该注意的地方.先了解一下log4net的理论知识. 参考百度百科 一.log4net是什么? log4net库是Apache log ...
- 图机器学习(GML)&图神经网络(GNN)原理和代码实现(前置学习系列二)
项目链接:https://aistudio.baidu.com/aistudio/projectdetail/4990947?contributionType=1 欢迎fork欢迎三连!文章篇幅有限, ...
- MyBatis学习系列二——增删改查
目录 MyBatis学习系列一之环境搭建 MyBatis学习系列二——增删改查 MyBatis学习系列三——结合Spring 数据库的经典操作:增删改查. 在这一章我们主要说明一下简单的查询和增删改, ...
- Maven学习系列二(1-5)
Maven学习系列二(1-5) 本文转自 QuantSeven 博客,讲解精炼易懂,适合入门,链接及截图如下 http://www.cnblogs.com/quanyongan/category/47 ...
- scrapy爬虫学习系列二:scrapy简单爬虫样例学习
系列文章列表: scrapy爬虫学习系列一:scrapy爬虫环境的准备: http://www.cnblogs.com/zhaojiedi1992/p/zhaojiedi_python_00 ...
- DocX开源WORD操作组件的学习系列二
DocX学习系列 DocX开源WORD操作组件的学习系列一 : http://www.cnblogs.com/zhaojiedi1992/p/zhaojiedi_sharp_001_docx1.htm ...
- [转]ASP.NET MVC学习系列(二)-WebAPI请求 传参
[转]ASP.NET MVC学习系列(二)-WebAPI请求 传参 本文转自:http://www.cnblogs.com/babycool/p/3922738.html ASP.NET MVC学习系 ...
- RabbitMQ学习系列二-C#代码发送消息
RabbitMQ学习系列二:.net 环境下 C#代码使用 RabbitMQ 消息队列 http://www.80iter.com/blog/1437455520862503 上一篇已经讲了Rabbi ...
- .net reactor 学习系列(二)---.net reactor界面各功能说明
原文:.net reactor 学习系列(二)---.net reactor界面各功能说明 安装了.net reactor之后,可以在安装目录下找到帮助文档REACTOR_HELP.c ...
随机推荐
- Java 多线程(三)—— 线程的生命周期及方法
这篇博客介绍线程的生命周期. 线程是一个动态执行的过程,它也有从创建到死亡的过程. 线程的几种状态 在 Thread 类中,有一个枚举内部类: 上面的信息以图片表示如下: 第一张图: 第二张图:把等待 ...
- 【ASP.NET Core快速入门】(十五)MVC开发:ReturnUrl实现、Model后端验证 、Model前端验证
ReturnUrl实现 我们要实现returnUrl,我们需要在注册(Register)方法中接收传进的returnUrl并给它默认值null,然后将它保存在ViewData里面 然后我们定义一个内部 ...
- 开源库支付库Magicodes.Pay发布
Magicodes.Pay,是心莱科技团队提供的统一支付库,相关库均使用.NET标准库编写,支持.NET Framework以及.NET Core.目前支持以下支付方式和功能: 支付宝APP支付 支付 ...
- Spring Boot (七)MyBatis代码自动生成和辅助插件
一.简介 1.1 MyBatis Generator介绍 MyBatis Generator 是MyBatis 官方出品的一款,用来自动生成MyBatis的 mapper.dao.entity 的框架 ...
- C#數據庫
一.連接數據庫 1.定義連接數據庫的字符串 string source = "server=(local); integrated security=SSPI; database=test& ...
- vi的三种模式
一般指令模式 (command mode)以 vi 打开一个文件就直接进入一般指令模式了(这是默认的模式,也简称为一般模式) .在这个模式中, 你可以使用“上下左右”按键来移动光标,你可以使用“删除字 ...
- [MySQL] mysql的事务隔离和幻读和死锁问题
1.系统要通过严格的ACID测试,ACID表示原子性/一致性/隔离性/持久性原子性:一个事务必须被视为一个不可分割的最小工作单元一致性:数据库总是从一个一致性的状态转换到另外一个一致性的状态隔离性:通 ...
- mysql 随机数 rand使用
生成随机数 生成0-3的随机数 SELECT RAND() * 最大不会超过3, SELECT FLOOR(RAND() * ) 上面生成整数的值是0,1,2,3生成的随机整数是1,2,3的话,语句如 ...
- Java设计模式——适配器模式(Adapter)
目的:把源类型适配为目标类型,以适应客户端(Client)的需求:此处我们把目标接口的调用方视为客户端 使用场景:需要对类型进行由源类型到目标类型转换的场景中 前置条件:已有客户端 //Client ...
- vs2013中集成Git
一:为什么不用2013中自带的? 我的2013自带的没法用,连最基本的克隆都用不了,网上看着下 好像说都不能用:不知道各位的如何. 二:如何自己讲Git集成到vs2013中? 需要的工具: ...