日志学习系列(二)——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 ...
随机推荐
- Spring中属性注入的几种方式以及复杂属性的注入
在Spring框架中,属性的注入我们有多种方式,我们可以通过构造方法注入,可以通过set方法注入,也可以通过p名称空间注入,方式多种多样,对于复杂的数据类型比如对象.数组.List集合.map集合.P ...
- CentOS 6.5中安装使用dstat资源统计工具
目录 1 dstat工具的使用 1.1 什么是dstat 1.2 dstat的基本使用 1.3 检测界面各参数的含义 1.4 dstat 的高级用法 2 dstat工具的安装 2.1 (推荐)通过yu ...
- 从0打卡leetcode之day 3 -- 最大子序列和
前言 就有要把leetcode的题刷完,每天一道题,每天进步一点点 从零打卡leetcode之day 3 题目描述: 给定一个int类型的数组,求最大子序列的和. 也就是说,从这个数组中截取一个子数组 ...
- 【ASP.NET Core快速入门】(十)Cookie-based认证实现
准备工作 新建MVC项目,然后用VSCode打开 dotnet new mvc --name MvcCookieAuthSample 在Controllers文件夹下新建AdminController ...
- FIVE1
Topic Link http://ctf5.shiyanbar.com/stega/FIVE1/1111110000000000.jpg 1) 直接放到HXD中,你会发现里面有一个zip文件 2)提 ...
- 让老板虎躯一震的前端技术,KPI杀手
本文由云+社区发表 作者:思衍Jax 天下武功,唯 (wei) 快(fu) 不(bu) 破(po). 随着近几年的前端技术的高速发展,越来越多的团队使用 React.Vue 等 SPA 框架作为其主要 ...
- Python迭代和解析(5):搞懂生成器和yield机制
解析.迭代和生成系列文章:https://www.cnblogs.com/f-ck-need-u/p/9832640.html 何为生成器 生成器的wiki页:https://en.wikipedia ...
- AddressSanitizer简介
AddressSanitizer 是一个快速的内存错误检测工具,它由一个编译时插桩模块和一个运行库组成.该工具可以检测以下类型的错误: 堆.栈和全局变量的越界 UAF Use-After-Return ...
- 第13章 切换到混合流并添加API访问 - Identity Server 4 中文文档(v1.0.0)
在之前的快速入门中,我们探讨了API访问和用户身份验证.现在我们想把这两个部分放在一起. OpenID Connect和OAuth 2.0组合的优点在于,您可以使用单个协议和使用令牌服务进行单次交换来 ...
- 零基础学Python--------第4章 序列的应用
第4章 序列的应用 4.1序列 序列是一块用于存放多个值的连续内存空间,并且按上一定顺序排列,每一个值(称为元素)都分配一个数字,称为索引或位置.通过该索引可以取出相应的值.例如,我们可以把一家酒店看 ...