• 使用Log4Net发送日志邮件 (转载)


    前言

     公司前几天重新确立了考核指标,主要是针对我们研发部,而我们的经理要求也高,对我们绩效考核扣分也挺狠的,100分的,出了几个严重bug就变 0分,反正只要被用户发现并且提出来了,就会扣分,没被用户发现自己解决了不追究,还没听说有人写的程序能不出bug,为了能及时的知道出现bug,所以 我在记录错误日志的时候就将错误信息通过邮件发给自己,现在手机微信这么方便,来了邮件就能收到,都是考核惹的祸啊!

    正题

       log4Net想必很多人都知道,从java的log4j演变而来,开源的,可以到这里下载http://logging.apache.org/log4net/download_log4net.cgi

       当然,现在项目中对log4net添加引用,通常都放在公共设施层。

     在项目中建个log4net.config的配置文件

    复制代码
     1 <?xml version="1.0"?>
     2 <configuration>
     3   <configSections>
     4     <section name="log4net" type="System.Configuration.IgnoreSectionHandler"/>
     5   </configSections>
     6   <log4net>
     7     <!--根据logger获取ILog对象-->
     8     <logger name="logger">
     9       <!--control log level: ALL|DEBUG|INFO|WARN|ERROR|FATAL|OFF-->
    10       <!--如果没有定义LEVEL的值,则缺省为DEBUG-->
    11       <level value="ALL" />
    12       <appender-ref ref="LogSmtpAppender" />
    13       <appender-ref ref="LogFileAppender" />
    14     </logger>
    15 
    16     <!--定义输出到文件中-->
    17     <appender name="LogFileAppender" type="log4net.Appender.FileAppender">
    18       <!--定义文件存放位置-->
    19       <file value="Log/Log.txt" />
    20       <appendToFile value="true" />
    21       <rollingStyle value="Date" />
    22       <datePattern value="yyyyMMdd-HH:mm:ss" />
    23       <layout type="log4net.Layout.PatternLayout">
    24         <!--输出格式-->
    25         <conversionPattern value="记录时间:%date 线程ID:[%thread] 日志级别:%-5level 出错类:%logger property:[%property{NDC}] - 错误描述:%message%newline" />
    26       </layout>
    27     </appender>
    28     <!--定义邮件发送-->
    29     <appender name="LogSmtpAppender" type="log4net.Appender.SmtpAppender">
    30       <authentication value="Basic" />
    31       <to value="接受邮件的邮箱" />
    32       <from value="发送邮件的邮箱" />
    33       <username value="发送邮件的邮箱" />
    34       <password value="发送邮件的密码" />
    35       <subject value="XXX应用错误日志消息" />
    36       <smtpHost value="smtp.exmail.qq.com" />
    37       <bufferSize value="2048" />
    38       <!--超长部分是否丢弃-->
    39       <lossy value="true" />
    40       <!-- 下面的定义, 就是 日志级别 大于 WARN 的, 才发邮件.  -->
    41       <evaluator type="log4net.Core.LevelEvaluator">
    42         <threshold value="ERROR"/>
    43       </evaluator>
    44       <!-- 下面是 定义邮件的格式 (好多换行啊) -->
    45       <layout type="log4net.Layout.PatternLayout">
    46         <conversionPattern value="%property{log4net:HostName} :: %level :: %message %newlineLogger: %logger%newlineThread: %thread%newlineDate: %date%newlineNDC: %property{NDC}%newline%newline" />
    47       </layout>
    48     </appender>
    49 
    50   </log4net>
    51 </configuration>
    复制代码

        以上配置的是记事本记录错误日志后邮件发送错误日志,邮件发送错误日志需要接受邮件和发送邮件,多个邮箱接受的话以“,”分割接受邮件(以上使用腾讯的企业游戏发送的,如果是其他邮箱,需要修改smtpHost的值)

     配置好了开始使用,先在AssemblyInfo.cs这个里面加上这句

    1 [assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]

       新建个Log类,负责处理错误日志

    复制代码
     1 public class Log
     2     {
     3         private static log4net.ILog log = log4net.LogManager.GetLogger("logger");
     4 
     5         public static void Debug(string message)
     6         {
     7             if (log.IsDebugEnabled)
     8             {
     9                 log.Debug(message);
    10             }
    11         }
    12 
    13         public static void Debug(System.Exception ex1)
    14         {
    15             if (log.IsDebugEnabled)
    16             {
    17                 log.Debug(ex1.Message.ToString() + "/r/n" + ex1.Source.ToString() + "/r/n" + ex1.TargetSite.ToString() + "/r/n" + ex1.StackTrace.ToString());
    18             }
    19         }
    20 
    21         public static void Error(string message)
    22         {
    23             if (log.IsErrorEnabled)
    24             {
    25                 log.Error(message);
    26             }
    27         }
    28 
    29         public static void Fatal(string message)
    30         {
    31 
    32             if (log.IsFatalEnabled)
    33             {
    34                 log.Fatal(message);
    35             }
    36         }
    37 
    38         public static void Info(string message)
    39         {
    40             if (log.IsInfoEnabled)
    41             {
    42                 log.Info(message);
    43             }
    44         }
    45 
    46         public static void Warn(string message)
    47         {
    48             if (log.IsWarnEnabled)
    49             {
    50                 log.Warn(message);
    51             }
    52         }
    53     }
    复制代码

     调用的时候,在各类方法的try{}catch{}的代码块里直接通过Log调用静态方法就可以了

     测试看看结果:

       在网站的目录里会有个Log文件夹,里面有个Log.txt文件

     

       邮件接受的:

     

  • 相关阅读:
    [BZOJ 1552] 排序机械臂
    [BZOJ 1124][POI 2008] 枪战 Maf
    [BZOJ 1647][USACO 2007 Open] Fliptile 翻格子游戏
    [BZOJ 1592] Making The Grade路面修整
    [BZOJ 3829][POI2014] FarmCraft
    [技术] 如何正确食用cnblogs的CSS定制
    [BZOJ 1458] 士兵占领
    今天写了一个Imageloader,,AndroidStudio报了Error:Execution failed for task ':app:mergeDebugResources'. > Error: Java.util.concurrent.ExecutionException: com.Android.ide.common.process.ProcessException: 这个错误
    Http响应码代表的含义
    获取WIFI列表,在旧手机上运行就没有问题,在新手机上就怎么也获取不到WIFI列表,长度一直为0,还不报异常,很疑惑。
  • 原文地址:https://www.cnblogs.com/CodeDeath/p/3906822.html
Copyright © 2020-2023  润新知