Log4net系列一:Log4net搭建之文本格式输出
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=""/>
<!--每个文件的大小。只在混合方式与文件大小方式下使用。超出大小后在所有文件名后自动增加正整数重新命名,数字最大的最早写入。可用的单位: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" />--> <!--样例:-- ::, [] 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搭建之文本格式输出的更多相关文章
- Log4net系列一:Log4net搭建之文本格式输出【转】
前言 项目开发中,记录项目日志是必须的,如果非要说日志的重要性(日志可看做,飞机的黑匣子,或者汽车的行车记录仪),根据等级进行记录,方便我们排查相关问题,以后项目运维中,也方便很多.基本上我们进入一家 ...
- 【Windows编程】系列第三篇:文本字符输出
上一篇我们展示了如何使用Windows SDK创建基本控件,本篇来讨论如何输出文本字符. 在使用Win32编程时,我们常常要输出文本到窗口上,Windows所有的文本字符或者图形输出都是通过图形设备接 ...
- PHP全栈开发(八):CSS Ⅳ 文本格式及字体
文本系列属性主要是设置文本格式的,例如.... 颜色 body {color:red;} h1 {color:#00ff00;} p.ex {color:rgb(0,0,255); 可以设置文本的居中 ...
- Log4net系列二:Log4net邮件日志以及授权码
Log4net邮件发送 上篇文章我们主要介绍Log4net生成文本格式,本篇文章主要配置邮箱发送.关于项目的引用,搭建我们就不在描述,如果不太清楚,请看上篇文章, 老规矩,我们现在配置文件中添加一个a ...
- Log4net日志使用教程-控制台、文本、数据库三种记录方式
一.log4net简介: 1. Log4net的优点: 几乎所有的大型应用都会有自己的用于跟踪调试的API.因为一旦程序被部署以后,就不太可能再利用专门的调试工具了.然而一个管理员可能需要有一套强大的 ...
- 在C#代码中应用Log4Net系列教程(附源代码)
Log4Net应该可以说是DotNet中最流行的开源日志组件了.以前需要苦逼写的日志类,在Log4Net中简单地配置一下就搞定了.没用过Log4Net,真心不知道原来日志组件也可以做得这么灵活,当然这 ...
- 在C#代码中应用Log4Net系列教程
在C#代码中应用Log4Net系列教程(附源代码) Log4Net应该可以说是DotNet中最流行的开源日志组件了.以前需要苦逼写的日志类,在Log4Net中简单地配置一下就搞定了.没用过Log4 ...
- [转]在C#代码中应用Log4Net系列教程(附源代码)
Log4Net应该可以说是DotNet中最流行的开源日志组件了.以前需要苦逼写的日志类,在Log4Net中简单地配置一下就搞定了.没用过Log4Net,真心不知道原来日志组件也可以做得这么灵活,当然这 ...
- 也用 Log4Net 之走进Log4Net (四)
转载地址:http://www.cnblogs.com/dragon/archive/2005/03/24/124254.html 我是转的别人的内容,我觉得他写的非常好,所以我把其中三分之二转了过来 ...
随机推荐
- TGraphiControl响应WM_MOUSEMOVE的过程(以TPaintBox为例)good
起因:非Windows句柄控件也可以处理鼠标消息,我想知道是怎么处理的:并且想知道处理消息的顺序(比如TPaintBox和TForm都响应WM_Mouse消息该怎么办)界面:把TPaintBox放到T ...
- Linux搭建lnmp环境
在CentOS 6上使用yum安装lnmp服务,原文链接http://www.qiansw.com/yum-lnmp.html
- Microsoft.XMLHTTP基本用法
客户端调用XMLHTTP的过程很简单,只有5个步骤:1.创建XMLHTTP对象2.打开与服务端的连接,同时定义指令发送方式,服务网页(URL)和请求权限等.客户端通过Open命令打开与服务端的服务网页 ...
- Oracle:手工建库
今天学习了小布老师的手工建库视频,自己也做了一遍,下面是创建过程记录: 本地环境oracle10.2.0.1 一.前期准备工作 1.设置环境变量 [oracle@app dbs]$ vi bbk.en ...
- lucene倒排索引瘦身的一些实验——merge的本质是减少cfx文件 变为pos和doc;存储term vector多了tvx和tvd文件有337M
store NO 压缩后的原始数据 原始数据大小 索引大小 索引时间 单词搜索时间 266 791 594 176 0.2 文件组成见后 运行forceMerge(3)后 merge的本质是减少cfx ...
- NSCoding
在IOS的开发中,小数据量的持久化都用NSUserDefaults来实现,但是NSUserDefaults只能保存NSString, NSNumber, NSDate, NSArray, NSDict ...
- ORACLE PL/SQL 实例精解之第五章 条件控制:CASE语句
5.1 CASE语句 1. CASE语句具有如下结构 CASE SELECTOR WHEN EXPRESSION 1 THEN STATEMENT 1; WHEN EXPRESSSION 2 THEN ...
- Vue 依赖收集原理分析
此文已由作者吴维伟授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. Vue实例在初始化时,可以接受以下几类数据: 模板 初始化数据 传递给组件的属性值 computed wat ...
- 51nod 1574 排列转换(猜结论)
分析 猜了一下结论,居然对了..........具体操作是:假设排列s是1,2,3,...,nk为排列p中最大的 没有放到正确位置的数,k的位置为posk的右边一定有一个数x<=pos(因为&l ...
- bzoj 3745: [Coci2015]Norma【分治】
参考:https://blog.csdn.net/lych_cys/article/details/51203960 真的不擅长这种-- 分治,对于一个(l,r),先递归求出(l,mid),(mid+ ...