分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 软件开发

Log4net系列一:Log4net搭建之文本格式输出

发布时间:2023-09-06 01:08责任编辑:沈小雨关键词:暂无标签

Log4net简介

前言

项目开发中,记录项目日志是必须的,如果非要说日志的重要性(日志可看做,飞机的黑匣子,或者汽车的行车记录仪),根据等级进行记录,方便我们排查相关问题,以后项目运维中,也方便很多。基本上我们进入一家公司,开发你从事什么岗位,公司产品或项目的框架都已经搭建好,我们有时候进行改版,根据业务延伸框架,记录日志基本都是我们自己去调用封装的方法。今天我们就对Log4net进行一下学习,Log4net可以做到:1、邮箱发送日志;2、记录到数据库;3、生成记事本文件。本章Log4net学习,以为是后面,我会简单一个微服务框架做准备。今天我们主要对邮箱发送日志,生产记事本文件两种方式研究。后期有时间我们在研究保存到数据库。

Log4net配置

 开发环境:VS2013  ,创建一个WebAPI 模拟项目场景去解析Log4Net

创建WebAPI步骤我们就做简述说明,下面框架目录,今天我们主要配置Log4net进行解析,所以只需要关注WebAPI 和WebAPICommon 就行,这里别忘记了三层之间的引用,WebAPI需要引用WebAPICommon 类库

 第一步,WebAPI 和WebAPICommon 中用NuGet搜索Log4net添加:Log4net引用

第二部,我们在WebAPI添加一个Log4net.config配置文件,它主要放我们的日志配置信息

第三部,在新建的Log4net.config配置文件中,添加日志配置,这里我们做两部分讲解(文本格式,邮件发送),今天主要讲解文本格式,邮箱配置我们做单独做模块;

下面把ERROR 为例,每行配置的具体解析:::

 <log4net> ???<!--错误日志:::记录错误日志--> ???<!--按日期分割日志文件 一天一个--> ???<!-- appender 定义日志输出方式 ??将日志以回滚文件的形式写到文件中。--> ???<appender name="ErrorAppender" type="log4net.Appender.RollingFileAppender"> ?????<!--保存路径:下面路径项目启动的时候自动在C盘中创建log、logError文件--> ?????<file value="C:\\log\\LogError\\"/>
??????<!-- 如果想在本项目中添加路径,那就直接去掉C:\\ ?只设置log\\LogError ??项目启动中默认创建文件 --> ?????<appendToFile value="true"/> ?????<!--按照何种方式产生多个日志文件(日期[Date],文件大小[Size],混合[Composite])--> ?????<rollingStyle value="Date"/> ?????<!--这是按日期产生文件夹--> ?????<datePattern value="yyyy\\yyyyMM\\yyyyMMdd‘.txt‘"/> ?????<!--是否只写到一个文件中--> ?????<staticLogFileName value="false"/> ?????<!--保留的log文件数量 超过此数量后 自动删除之前的 ??好像只有在 按Size分割时有效 设定值value="-1"为不限文件数--> ?????<param name="MaxSizeRollBackups" value="100"/> ?????<!--每个文件的大小。只在混合方式与文件大小方式下使用。超出大小后在所有文件名后自动增加正整数重新命名,数字最大的最早写入。可用的单位:KB|MB|GB。不要使用小数,否则会一直写入当前日志--> ?????<maximumFileSize value="1GB" /> ?????<!-- layout 控制Appender的输出格式,也可以是xml ?一个Appender只能是一个layout--> ?????<layout type="log4net.Layout.PatternLayout"> ???????<!--每条日志末尾的文字说明--> ???????<!--输出格式 模板--> ???????<!-- <param name="ConversionPattern" ?value="记录时间:%date 线程ID:[%thread] 日志级别:%-5level 记录类:%logger ??????????操作者ID:%property{Operator} 操作类型:%property{Action}%n ?当前机器名:%property%n当前机器名及登录用户:%username %n ?????????记录位置:%location%n 消息描述:%property{Message}%n ??异常:%exception%n 消息:%message%newline%n%n" />--> ???????<!--样例:2008-03-26 13:42:32,111 [10] INFO ?Log4NetDemo.MainClass [(null)] - info--> ???????<!--<conversionPattern value="%newline %n记录时间:%date %n线程ID:[%thread] %n日志级别: %-5level %n错误描述:%message%newline %n"/>--> ???????<conversionPattern value="%n========== ?????????????????????????????????%n【日志级别】%-5level ?????????????????????????????????%n【记录时间】%date ?????????????????????????????????%n【线程编号】[%thread] ?????????????????????????????????%n【执行时间】[%r]毫秒 ?????????????????????????????????%n【出错文件】%F ?????????????????????????????????%n【出错行号】%L ?????????????????????????????????%n【出错的类】%logger 属性[%property{NDC}] ?????????????????????????????????%n【错误描述】%message ?????????????????????????????????%n【错误详情】%newline"/> ?????</layout> ???</appender> ???<!--Error日志::: 错误日志--> ???<logger name="logerror"> ?????<level value="ERROR" /> ?????<appender-ref ref="ErrorAppender" /> ???</logger> ?</log4net>

第四部: 在WebAPICommon类库中添加LogHelper类,该类就是获取配置类的配置,传送错误信息,可以直接复用;

[assembly: log4net.Config.XmlConfigurator(ConfigFileExtension = "log4net", Watch = true)]namespace WebAPICommon{
?????//日志的公共帮助类 ???public class LogHelper ???{ ???????#region ???????/// <summary> ???????/// ????????/// </summary> ???????/// <param name="msg"></param> ???????public static void ErrorLog(object msg) ???????{ ???????????log4net.ILog log = log4net.LogManager.GetLogger("logerror"); ???????????Task.Run(() => log.Error(msg)); ??//异步 ???????????// Task.Factory.StartNew(() =>log.Error(msg));// ?这种异步也可以
???????????//log.Error(msg); ???//这种也行跟你需要,性能越好,越强大,我还是使用异步方式
 ???????} ???????/// <summary> ???????/// ????????/// </summary> ???????/// <param name="ex"></param> ???????public static void ErrorLog(Exception ex) ???????{ ???????????log4net.ILog log = log4net.LogManager.GetLogger("logerror"); ???????????Task.Run(() => log.Error(ex.Message.ToString() + "/r/n" + ex.Source.ToString() + "/r/n" + ex.TargetSite.ToString() + "/r/n" + ex.StackTrace.ToString())); ???????} ???????/// <summary> ???????/// ????????/// </summary> ???????/// <param name="msg"></param> ???????/// <param name="ex"></param> ???????public static void ErrorLog(object msg, Exception ex) ???????{ ???????????log4net.ILog log = log4net.LogManager.GetLogger("logerror"); ???????????if (ex != null) ???????????{ ???????????????Task.Run(() => log.Error(msg, ex)); ??//异步 ???????????} ???????????else ???????????{ ???????????????Task.Run(() => log.Error(msg)); ??//异步 ???????????} ???????} ???????#endregion ???}}

查看后台代码你会发现,以Error为例有两个方法,两种方式传参数,我们上面的封装也是根据我们的业务需求,去扩展封装

方法解析重点::  

 LogManager类,它用来管理所有的Logger.它的GetLogger静态方法可以获取配置文件中的Logger        

 ?log4net.ILog log = log4net.LogManager.GetLogger("logerror"); ?
 ??//该方法也可以写公共的创建,然后直接使用

   //static readonly log4net.ILog loginfo = log4net.LogManager.GetLogger("loginfo");
   // static readonly log4net.ILog logerror = log4net.LogManager.GetLogger("logerror");

我们介绍一下  文章中有一句话

[assembly: log4net.Config.XmlConfigurator(ConfigFileExtension = "log4net", Watch = true)]我们来解读一下

首先我们先说一下 log4net.Config.XmlConifguratorAttribute

XmlConfiguratorAttribute有3个属性:ConfigFile: 配置文件的名字,文件路径相对于应用程序目录(AppDomain.CurrentDomain.BaseDirectory)。ConfigFile属性不能和ConfigFileExtension属性一起使用。ConfigFileExtension: 配置文件的扩展名,文件路径相对于应用程序的目录。ConfigFileExtension属性不能和ConfigFile属性一起使用。Watch: 如果将Watch属性设置为true,就会监视配置文件。当配置文件发生变化的时候,就会重新加载。如果ConfigFile和ConfigFileExtension都没有设置,则使用应用程序的配置文件App.config(Web.config)。

可以在项目的AssemblyInfo.cs文件里添加以下的语句,根据配置业务项目中配置不同,可以直接复制粘贴:

 //监视默认的配置文件,App.exe.config ??[assembly: log4net.Config.XmlConfigurator(Watch = true)]//监视配置文件,App.exe.log4net。[assembly: log4net. Config.XmlConfigurator(ConfigFileExtension = "log4net", Watch = true)]//使用配置文件log4net.config,不监视改变。注意log4net.config文件的目录,BS程序在站点目录//下,CS则在应用程序启动目录下,如调试时在/bin/Debug下,一般将文件属性的文件输出目录调为//始终复制即可[assembly: log4net. Config.XmlConfigurator(ConfigFile = "log4net.config")]//使用配置文件log4net.config,不监视改变[assembly: log4net. Config.XmlConfigurator()]

第五部:我们才用的WebAPI测试,还需要启动项目日志

在WebAPI中找到:Global文件

Global.asax 文件是 ASP.NET 应用程序的中心点。它提供无数的事件来处理不同的应用程序级任务,比如用户身份验证、应用程序启动以及处理用户会话等。你应该熟悉这个可选文件,这样就可以构建出健壮的ASP.NET 应用程序。

 ?protected void Application_Start() ???????{ ???????????AreaRegistration.RegisterAllAreas(); ???????????GlobalConfiguration.Configure(WebApiConfig.Register); ???????????FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); ???????????RouteConfig.RegisterRoutes(RouteTable.Routes); ???????????BundleConfig.RegisterBundles(BundleTable.Bundles);

???????????//启动项日志记录 ?//若不想把lognet配置文件写在web.config中,也可以另外手动指定。 ???????????log4net.Config.XmlConfigurator.ConfigureAndWatch(new FileInfo(Server.MapPath("/log4net.config"))); ???????} ???????/// <summary> ???????/// ?程序出错时通过lognet写日志 ???????/// </summary> ???????/// <param name="sender"></param> ???????/// <param name="e"></param> ???????protected void Application_Error(Object sender, EventArgs e) ???????{ ???????????Exception objExp = HttpContext.Current.Server.GetLastError(); ???????????LogHelper.ErrorLog("\r\n客户机IP:" + Request.UserHostAddress + "\r\n错误地址:" + Request.Url ???????????????+ "\r\n异常信息:" + Server.GetLastError().Message, objExp); ???????}
方法解析: Application_Error,该方法我个人建议添加,如果你的项目其中过程就报错,我们可以捕捉到异常信息。

最后一步:我们进行测试,在你需要的地方,引用WebAPICommon类库, ??
?在你需要的地方加入 ??
LogHelper.ErrorLog(object);
public bool Add(Department department) ???????{ ???????????try ???????????{ ???????????????return dep.Add(department); ???????????} ???????????catch (Exception ex) ???????????{ ???????????????LogHelper.ErrorLog(ex); ?//在你需要的地方 ?加入 LogHelper.ErrorLog(ex)
???????????????throw;
 } }
 查看结果:C盘默认创建我配置的文件,
按照:::年----月-----创建
 文本记录显示:就是我们在配置文件中自行定义,
 ?Log4net 记事本日志记录,到现在已经结束了,新手上路,如果有描述不正确的地方,还请多多指教!!!
?下一篇:我们主要介绍Log4net中邮箱发送日志文件,正在熬夜开车中。。。。。
 
  • 博主是利用读书、参考、引用、抄袭、复制和粘贴等多种方式打造成自己的纯镀 24k 文章,请原谅博主成为一个无耻的文档搬运工!
  • 小弟刚迈入博客编写,文中如有不对,欢迎用板砖扶正,希望给你有所帮助。

Log4net系列一:Log4net搭建之文本格式输出

原文地址:http://www.cnblogs.com/lrzr/p/7466588.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved