一、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的实例的更多相关文章

  1. 日志学习系列(一)——Log4net的基础知识学习

    今天把Log4net日志记录做了封装,作为一个公共的类库.记录一下应该注意的地方.先了解一下log4net的理论知识. 参考百度百科 一.log4net是什么? log4net库是Apache log ...

  2. 图机器学习(GML)&图神经网络(GNN)原理和代码实现(前置学习系列二)

    项目链接:https://aistudio.baidu.com/aistudio/projectdetail/4990947?contributionType=1 欢迎fork欢迎三连!文章篇幅有限, ...

  3. MyBatis学习系列二——增删改查

    目录 MyBatis学习系列一之环境搭建 MyBatis学习系列二——增删改查 MyBatis学习系列三——结合Spring 数据库的经典操作:增删改查. 在这一章我们主要说明一下简单的查询和增删改, ...

  4. Maven学习系列二(1-5)

    Maven学习系列二(1-5) 本文转自 QuantSeven 博客,讲解精炼易懂,适合入门,链接及截图如下 http://www.cnblogs.com/quanyongan/category/47 ...

  5. scrapy爬虫学习系列二:scrapy简单爬虫样例学习

    系列文章列表: scrapy爬虫学习系列一:scrapy爬虫环境的准备:      http://www.cnblogs.com/zhaojiedi1992/p/zhaojiedi_python_00 ...

  6. DocX开源WORD操作组件的学习系列二

    DocX学习系列 DocX开源WORD操作组件的学习系列一 : http://www.cnblogs.com/zhaojiedi1992/p/zhaojiedi_sharp_001_docx1.htm ...

  7. [转]ASP.NET MVC学习系列(二)-WebAPI请求 传参

    [转]ASP.NET MVC学习系列(二)-WebAPI请求 传参 本文转自:http://www.cnblogs.com/babycool/p/3922738.html ASP.NET MVC学习系 ...

  8. RabbitMQ学习系列二-C#代码发送消息

    RabbitMQ学习系列二:.net 环境下 C#代码使用 RabbitMQ 消息队列 http://www.80iter.com/blog/1437455520862503 上一篇已经讲了Rabbi ...

  9. .net reactor 学习系列(二)---.net reactor界面各功能说明

    原文:.net reactor 学习系列(二)---.net reactor界面各功能说明         安装了.net reactor之后,可以在安装目录下找到帮助文档REACTOR_HELP.c ...

随机推荐

  1. 『扩展欧几里得算法 Extended Euclid』

    Euclid算法(gcd) 在学习扩展欧几里得算法之前,当然要复习一下欧几里得算法啦. 众所周知,欧几里得算法又称gcd算法,辗转相除法,可以在\(O(log_2b)\)时间内求解\((a,b)\)( ...

  2. asp.net core系列 26 EF模型配置(实体关系)

    一.概述 EF实体关系定义了两个实体互相关联起来(主体实体和依赖实体的关系,对应数据库中主表和子表关系). 在关系型数据库中,这种表示是通过外键约束来体现.本篇主要讲一对多的关系.先了解下描述关系的术 ...

  3. C++版 - 剑指Offer 面试题35:第一个只出现一次的字符 解题报告(华为OJ034-找出字符串中第一个只出现一次的字符)

    面试题35:第一个只出现一次的字符 题目:在一个字符串中找到第一个只出现一次的字符.如输入abaccdeff,则输出b.(2006年google的一道笔试题.) 分析: 首先应向确认一下是ASCII字 ...

  4. Python多版本共存(生产环境)

    安装pyenv $ git clone git://github.com/yyuu/pyenv.git ~/.pyenv $ echo 'export PYENV_ROOT="$HOME/. ...

  5. 使用logdashboard查看可视化日志

    logdashboard 日志面板是我在Github写的一个开源项目,旨在让查看日志变的方便快捷.在线预览 现在功能有日志检索.趋势图.异常堆栈快速查看.日志详情等 logdashboard支持自定义 ...

  6. RabbitMQ消息队列(三)-Centos7下安装RabbitMQ3.6.1

    如果你看过前两章对RabbitMQ已经有了一定了解,现在已经摩拳擦掌,来吧动手吧! 用什么系统 本文使用的是Centos7,为了保证对linux不太熟悉的伙伴也能轻松上手(避免折在安装的路上),下面是 ...

  7. SmartSql = Dapper + MyBatis + Cache(Memory | Redis) + ZooKeeper + R/W Splitting + ......

    SmartSql Why 拥抱 跨平台 DotNet Core,是时候了. 高性能.高生产力,超轻量级的ORM.156kb (Dapper:168kb) So SmartSql TargetFrame ...

  8. 深耕品质,腾讯WeTest《2018中国移动游戏质量白皮书》正式发布

    本文由云+社区发表 作者:腾讯WeTest 原文链接:https://wetest.qq.com/lab/view/437.html 对于游戏行业的不少人来说,2018年是一个多事之秋. 放眼大局,游 ...

  9. 痞子衡嵌入式:第一本Git命令教程(3)- 变动(status/diff)

    今天是Git系列课程第三课,前两课我们都是在做Git仓库准备工作,今天痞子衡要讲的是如何查看Git空间内发生的改动. 本地有了仓库,我们便可以在仓库所在目录下做文件增删改操作,为了确定改动操作的正确性 ...

  10. InterLocked学习笔记

    在进行多线程编程的时候特别重要的一点就是多线程的同步,什么是同步呢?字面意思就是使多个不在同一线程执行的代码统一到一个线程中执行,但是对执行中的线程过程却无法控制,这就造成了多个线程可能同时操作同一个 ...