• 用log4net记录日志信息


    在.net中用log4net记录日志信息,已经是很平常的事情了。

    log4net下载:http://logging.apache.org/log4net/download_log4net.cgi

    百度网盘下载:http://pan.baidu.com/s/1i3GM8ML

    下载后。引用log4net.dll到项目中

    添加引用:

    using log4net.Config;
    using log4net;

    生成项目后。你会发现:

    这是项目框架造成的:

    将目标框架默认的.NET Framework4 Client Profile修改为.NET Framework4之后再重新生成解决方案就行了。

    不知道为什么。创建项目默认会是.NET Framework4 Client Profile的。其实这个框架会出现很多问题

    比如:不能引用system.web程序集。遇到的就应该知道。不过知道问题的来源就好解决了。

     

    好了。log4net准备好了。现在当然是配置文件,没有app.config的话。可以手动添加一个app.config文件

    日志文件一般是写在文本文件里面。或者记录在数据库。但大家都推荐记录在文本文件中。

    先看怎么把日志文件写入文本文件,来看看app.config的配置,

     1 <configuration>
     2     <configSections>
     3         <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
     4     </configSections>
     5     <log4net>
     6         定义输出到文件中
     7         <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
     8             定义文件存放位置
     9             <file value="log\"/>
    10             <appendToFile value="true"/>
    11             <rollingStyle value="Date"/>
    12             <datePattern value="yyyy\yyyyMM\yyyyMMdd'.txt'"/>
    13             <staticLogFileName value="false"/>
    14             <param name="MaxSizeRollBackups" value="100"/>
    15             <layout type="log4net.Layout.PatternLayout">
    16                 <!--每条日志末尾的文字说明
    17                 输出格式
    18                 样例:2008-03-26 13:42:32,111 [10] INFO  Log4NetDemo.MainClass [(null)] - info-->
    19                 <conversionPattern value="%newline %n记录时间:%date %n线程ID:[%thread] %n日志级别:  %-5level %n出错类:%logger property: [%property{NDC}] - %n错误描述:%message%newline %n"/>
    20             </layout>
    21         </appender>
    22         <root>
    23             <level value="ERROR"/>
    24             文件形式记录日志
    25             <appender-ref ref="RollingLogFileAppender"/>
    26         </root>
    27     </log4net>
    28     <startup>
    29         <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
    30     </startup>
    31 </configuration>

     提供一个LogHelper.cs类

     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Text;
     5 
     6 //在项目的程序集信息描述文件中,设置Log4net的可记录属性
     7 [assembly: log4net.Config.XmlConfigurator(Watch = true)]
     8 namespace ConsoleApplication1
     9 {
    10     class LogHelper
    11     {
    12         /// <summary>
    13         /// 输出日志到Log4Net
    14         /// </summary>
    15         /// <param name="t">当前消息来自成员的类</param>
    16         /// <param name="ex">异常信息</param>
    17         #region static void WriteLog(Type t, Exception ex)
    18 
    19         public static void WriteLog(Type t, Exception ex)
    20         {
    21             log4net.ILog log = log4net.LogManager.GetLogger(t);
    22             log.Error(ex.Message, ex);
    23             //log.Info(ex.Message, ex);
    24         }
    25 
    26         #endregion
    27 
    28         /// <summary>
    29         /// 输出日志到Log4Net
    30         /// </summary>
    31         /// <param name="t">当前消息来自成员的类</param>
    32         /// <param name="msg">错误消息</param>
    33         #region static void WriteLog(Type t, string msg)
    34 
    35         public static void WriteLog(Type t, string msg)
    36         {
    37             log4net.ILog log = log4net.LogManager.GetLogger(t);
    38             //log.Error(msg);
    39             log.Info("dd");
    40         }
    41 
    42         #endregion
    43     }
    44 }

     配置文件有了,LogHelper帮助了也有了。现在当然是测试,模拟程序异常。写入文本文件中

     1 ////第一种方法。直接记录错误消息
     2             //LogHelper.WriteLog(typeof(Program), "测试Log4Net日志是否写入");
     3 
     4             ////第二种方法:捕获异常
     5             try
     6             {
     7                 //int c = 0;
     8                // int i = 8 / c; //此处异常,将被cath捕获
     9 
    10                 Program c = null;
    11                 c.ToString();
    12             }
    13             catch (Exception ex)
    14             {
    15                 //此处已经封装到LogHelper类
    16                 //log4net.ILog log = log4net.LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
    17                 //log.Error("Error", ex);
    18 
    19                 //Program是该成员的类,可以这样获取,利用反射:MethodBase.GetCurrentMethod().DeclaringType
    20                 //LogHelper.WriteLog(typeof(Program), ex);
    21                 //所以也可以这样写
    22                 LogHelper.WriteLog(MethodBase.GetCurrentMethod().DeclaringType, ex);
    23 
    24                 //一般错误
    25                 LogHelper.WriteLog(MethodBase.GetCurrentMethod().DeclaringType, "一般错误");
    26             }

    因为app.config中配置的日志路径是:<file value="log\"/>

    即在Debug目录下面会有一个log文件夹,并以当前年份生成了子文件夹,最里面才是文本文件

    打开看日志。如愿是生成了错误信息,没有找到对象,程序员经常遇到的错误

    如果写入文本文件已经满足不了你。那你可以尝试把错误信息写入数据库

    首先创建在sql server中创建保存的表

    USE log4net
    GO
    
    /****** Object:  Table [dbo].[Log]******/
    SET ANSI_NULLS ON
    GO
    
    SET QUOTED_IDENTIFIER ON
    GO
    
    SET ANSI_PADDING ON
    GO
    
    CREATE TABLE [dbo].[Log](
        [Id] [int] IDENTITY(1,1) NOT NULL, --id
        [LevelName] [varchar](50) NULL, --级别名称
        --[UserID] [int] NULL,
        [Message] [varchar](4000) NULL, --错误描述
        --[Exception] [varchar](2000) NULL,
        [RecordTime] [varchar](50) NULL, --记录时间
     CONSTRAINT [PK_Log_1] PRIMARY KEY CLUSTERED 
    (
        [Id] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    
    GO
    
    SET ANSI_PADDING OFF
    GO

    修改app.config文件:

     1 <configuration>
     2     <configSections>
     3         <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
     4     </configSections>
     5 
     6 
     7     <log4net>
     8         <!--<root>
     9             <level value="INFO"></level>
    10             <appender-ref ref="AdoNetAppender_SQL"/>
    11         </root>-->
    12 
    13         <logger name="WebLogger">
    14             <level value="INFO"/>
    15             <appender-ref ref="ADONetAppender" />
    16 
    17         </logger>
    18 
    19         <!--SQL数据库-->
    20         <appender name="ADONetAppender" type="log4net.Appender.AdoNetAppender">
    21 
    22             <bufferSize value="1"/>
    23 
    24             <!-- SQL数据源 ,本地安装SQL客户端-->
    25             <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
    26 
    27             <!-- SQL连接字符串-->
    28             <connectionString value="data source=.;initial catalog=log4net;integrated security=False;persist security info=True;User ID=sa;Password=123" />
    29 
    30             <commandText value="INSERT INTO Log ([RecordTime],[LevelName],[Message]) VALUES (@log_date, @log_level, @message)"/>
    31 
    32             <parameter>
    33                 <parameterName value="@log_date"/>
    34                 <dbType value="DateTime"/>
    35                 <layout type="log4net.Layout.RawTimeStampLayout"/>
    36             </parameter>
    37 
    38             <parameter>
    39                 <parameterName value="@log_level"/>
    40                 <dbType value="String"/>
    41                 <size value="50"/>
    42                 <layout type="log4net.Layout.PatternLayout">
    43                     <conversionPattern value="%level"/>
    44                 </layout>
    45             </parameter>
    46 
    47             <!--<parameter>
    48                 <parameterName value="@exception"/>
    49                 <dbType value="String"/>
    50                 <size value="2000"/>
    51                 <layout type="log4net.Layout.ExceptionLayout"/>
    52             </parameter>-->
    53 
    54             <parameter>
    55                 <parameterName value="@message"/>
    56                 <dbType value="String"/>
    57                 <size value="4000"/>
    58                 <layout type="log4net.Layout.PatternLayout">
    59                     <conversionPattern value="%message"/>
    60                 </layout>
    61             </parameter>
    62 
    63             <!--自定义成员 -->
    64             <!--<parameter>
    65                 <parameterName value="@UserID" />
    66                 <dbType value="Int32" />
    67 
    68                 <layout type="JJ.Data.LogCommon.CustomLayout">
    69                     <conversionPattern value="%UserID" />
    70                 </layout>
    71 
    72             </parameter>-->
    73 
    74         </appender>
    75 
    76         <!--<root>
    77       <level value="DEBUG" />
    78       <appender-ref ref="ADONetAppender" />
    79       
    80     </root>-->
    81 
    82     </log4net>
    83 
    84     <startup>
    85         <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
    86     </startup>
    87 
    88 </configuration>

    这里编写一个测试类。代码有些荣誉,暂时没考虑封装

      1  public class LogHelper1
      2     {
      3         public LogHelper1()
      4         {
      5 
      6         }
      7 
      8         public static string LoggerName = string.Empty;
      9 
     10         private static LogMessage message = null;
     11 
     12         private static ILog _log;
     13 
     14         public static ILog log
     15         {
     16             get
     17             {
     18                 string path = @"D:ProjectConsoleApplication1ConsoleApplication1App5.config";
     19                 //ILog log = log4net.LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
     20                 log4net.Config.XmlConfigurator.Configure(new FileInfo(path)); //根据路径直接读取app.config
     21                 //log4net.Config.XmlConfigurator.Configure(); //加载app.config,这里名字必须是app.config
     22 
     23                 if (_log == null)
     24                 {
     25                     //从配置文件中读取Logger对象  
     26                     //WebLogger 里面的配置信息是用来将日志录入到数据库的
     27                     //做为扩展 做判断来确定日志的记录形式,数据库也好,txt文档也好,控制台程序也好。
     28                     _log = log4net.LogManager.GetLogger(LoggerName); 
     29                 }
     30                 else
     31                 {
     32                     if (_log.Logger.Name != LoggerName)
     33                     {
     34                         _log = log4net.LogManager.GetLogger(LoggerName);
     35                     }
     36                 }
     37 
     38                 return _log;
     39             }
     40         }
     41 
     42 
     43         /// <summary>
     44         /// 调试
     45         /// </summary>
     46         public static void debug()
     47         {
     48             if (log.IsDebugEnabled)
     49             {
     50                 log.Debug(message);
     51             }
     52         }
     53 
     54 
     55         /// <summary>
     56         /// 错误
     57         /// </summary>
     58         public static void error()
     59         {
     60             if (log.IsErrorEnabled)
     61             {
     62                 log.Error(message);
     63             }
     64         }
     65 
     66         /// <summary>
     67         /// 严重错误
     68         /// </summary>
     69         public static void fatal()
     70         {
     71             if (log.IsFatalEnabled)
     72             {
     73                 log.Fatal(message);
     74             }
     75         }
     76 
     77         /// <summary>
     78         /// 记录一般日志
     79         /// </summary>
     80         public static void info()
     81         {
     82             if (log.IsInfoEnabled)
     83             {
     84                 log.Info(message.message);
     85             }
     86         }
     87 
     88 
     89         /// <summary>
     90         /// 记录警告
     91         /// </summary>
     92         public static void warn()
     93         {
     94             if (log.IsWarnEnabled)
     95             {
     96                 log.Warn(message);
     97             }
     98         }
     99 
    100 
    101         /// <summary>  
    102         /// 需要写日志的地方调用此方法  
    103         /// </summary>  
    104         /// <param name="level">自定义级别</param>  
    105         public static void SaveMessage(LogMessage logMessage, int level)
    106         {
    107             message = logMessage;
    108 
    109             switch (level)
    110             {
    111                 case 1:
    112                     info();
    113                     break;
    114 
    115                 case 2:
    116                     warn();
    117                     break;
    118 
    119                 case 3:
    120                     error();
    121                     break;
    122 
    123                 case 4:
    124                     fatal();
    125                     break;
    126 
    127                 default: break;
    128             }
    129         }
    130 
    131     }
    132 
    133   /// <summary>
    134     /// 错误提示类
    135     /// </summary>
    136     public class LogMessage
    137     {
    138         public object message { get; set; }
    139 
    140     }

    测试代码

     1    try
     2             {
     3                 int c = 0;
     4                 int i = 8 / c;
     5 
     6             }
     7             catch (Exception ex)
     8             {
     9 
    10                 //LogHelper1.LoggerName = "WebLogger";
    11                 LogMessage logMessage = new LogMessage();
    12                 logMessage.message = ex;
    13 
    14                 //logMessage.UserID = 123456;
    15                 LogHelper1.SaveMessage(logMessage, 1);
    16 
    17             }

    查看数据库,也如你所愿记录了信息

     

    看博客永远是别人的。只有在看了后自己动手操作一次,两次。。。。才是自己的。

    现在怕就怕你不努力。不要怕没有东西学!!

    参考资料:

    http://www.cnblogs.com/wangsaiming/archive/2013/01/11/2856253.html

    http://www.cnblogs.com/Lhuatao/p/4431023.html#3164867

    http://www.cnblogs.com/mbailing/archive/2012/08/28/2660002.html

     

  • 相关阅读:
    thread ---- join
    函数传参传的是啥的思考【java Python】
    关于 私有变量的访问问题【 java python]
    编程语言的某些 概念
    python 小整数池 和intern 【整理】
    [题解] uva 11354 Bond(kruskal最小生成树+倍增LCA)
    [题解] bzoj 1016 jsoi 2008 最小生成树计数 (kruskal最小生成树)
    [题解] bzoj 1821 jsoi 2010 Group 部落划分(kruskal最小生成树)
    [题解] uva 10369 Arctic Network(kruskal最小生成树)
    [题解] 洛谷 P1550 USACO 2008 OCT 打井Watering Hole (kruskal最小生成树)
  • 原文地址:https://www.cnblogs.com/nsky/p/4482790.html
Copyright © 2020-2023  润新知