zoukankan      html  css  js  c++  java
  • 定时压缩日志文件并发送到邮箱

    在项目中使用Log4Net记录日志到txt文件,需要经常查看日志分析运行情况,所以产生了压缩日志并发送到邮箱的需求,在网上查找一番后没找到现成的,所以写了这么一个WinForm程序 ZipLogToEmail ,截图:

    功能:

    1.smtp服务器、收发邮箱、监视的文件等配置信息存放在App.config文件中

    2. 支持配置多个接收邮箱,第一个为接收邮箱,其余的都是抄送邮箱。

    3.支持绝对路径和相对路径两种方式配置要监视的多个日志文件。

    4.多个日志文件压缩成一个文件以附件形式发送。

    5.通过ILMerge-GUI.exe 将类库ICSharpCode.SharpZipLib.dll合并到住文件中。

    6. 开机自启动,右下角托盘执行。

    下面对用到的知识点和代码做下整理:

     1. 配置文件,如果您需要使用该工具时请务必自己去申请一个免费邮箱。    

    App.Config

     1   <appSettings>
     2     <!--SMTP服务器-->
     3     <add key="SMTPServer" value="smtp.126.com"/>
     4     <!--发送邮箱-->
     5     <add key="SendEmail" value="LogSend@126.com"/>
     6     <!--发送账号-->
     7     <add key="SendUser" value="LogSend"/>
     8     <!--发送密码,使用时请输入真实的密码-->
     9     <add key="SendPwd" value="*********"/>
    10     <!--接收邮箱,多个邮箱时使用|分隔,第一个为接收邮箱其余为抄送邮箱-->
    11     <add key="ReceiveEmails" value="zbl131@126.com"/>    
    12     <!--发送间隔,分钟-->
    13     <add key="LogSendIntervalMin" value="2"/>
    14     <!--监视的文件,多个文件时以|分隔,每个文件如果包含":\"字符则为绝对路径,否则为相对路径-->
    15     <add key="LogFiles" value="SysRunLog.txt|FaultDealLog.txt"/>
    16     <!--开机自启动-->
    17     <add key="IsAutoStart" value="false"/>
    18   </appSettings>

     2. 发送邮件,用到了抄送和附件功能

         生产附件->发送邮件->释放附件->删除附件,一定要释放否则删除时报另一个进程正在占用文件。

    SendEmail
     1   /// <summary>
     2   /// 发送邮件
     3   /// </summary>
     4  private void SendEmail(string smtpServer, string fromEmail, string toEmail, string userName, string userPwd, List<string> ccEmails, List<string> files)
    11         {
    12             MailAddress from = new MailAddress(fromEmail);
    13             MailAddress to = new MailAddress(toEmail);
    14             MailMessage message = new MailMessage(from, to);
    15             message.Subject = "日志文件";
    16             message.Body = "见附件,QQ:305744659";
    17             ccEmails.ForEach(q => message.CC.Add(new MailAddress(q))); //添加抄送地址
    18             SmtpClient client = new SmtpClient(smtpServer);
    19 
    20             client.Credentials = new NetworkCredential(userName, userPwd);
    21             List<string> tempFileList = new List<string>();
    22 
    23             //多个文件压缩成一个压缩文件
    24             string tempFile = this.ZipFile(Application.StartupPath + "\\日志文件.rar", files,true);
    25             message.Attachments.Add(new Attachment(tempFile)); // 添加附件
    26             tempFileList.Add(tempFile);
    27 
    28             //每个文件压缩成一个压缩文件
    29             //foreach (string filepath in files)
    30             //{
    31             //    if (!System.IO.File.Exists(filepath))
    32             //        continue;
    33             //    string tempFile = this.ZipFile(filepath);
    34             //    message.Attachments.Add(new Attachment(tempFile));
    35             //    tempFileList.Add(tempFile);
    36             //}
    37             client.Send(message);
    38             foreach (Attachment attachment in message.Attachments)
    39             {
    40                 attachment.Dispose(); //注意:发送完成后,一定要释放附件,否则下面不能删除该临时文件
    41             }
    42             tempFileList.ForEach(q => File.Delete(q)); //删除临时文件
    43 
    44         }

    3. 文件压缩

      使用ICSharpCode.SharpZipLib.dll进行压缩,压缩前备份->压缩->删除备份,在使用Log4Net记录日志的系统中日志文件总是被应用进程占用的,所以不能直接压缩日志文件。

    ZipFile
     1         /// <summary>
     2         /// 压缩文件
     3         /// </summary>
     4         /// <param name="zipFile">压缩后的文件名称</param>
     5         /// <param name="fileList">文件列表</param>
     6         /// <param name="isBakBeforeZip">压缩前是否备份</param>
     7         /// <returns></returns>
     8         private string ZipFile(string zipFile, List<string> fileList, bool isBakBeforeZip)
     9         {
    10 
    11             ZipOutputStream zipOutputStream = new ZipOutputStream(File.Create(zipFile));
    12 
    13             foreach (string fileName in fileList)
    14             {
    15                 if (File.Exists(fileName))
    16                 {
    17                     FileStream f = null;
    18                     zipOutputStream.SetLevel(9);
    19                     if (isBakBeforeZip) //对于正在运行的系统日志文件很可能正在被另一个进程占用,所以要先进行备份
    20                     {
    21                         File.Copy(fileName, fileName + ".bak"true);
    22                         f = File.OpenRead(fileName + ".bak");
    23                     }
    24                     else
    25                     {
    26                         f = File.OpenRead(fileName);
    27                     }
    28 
    29 
    30                     byte[] b = new byte[f.Length];
    31                     f.Read(b, 0, b.Length);
    32                     ZipEntry z = new ZipEntry(fileName.Substring(fileName.LastIndexOf("\\") + 1));
    33                     zipOutputStream.PutNextEntry(z);
    34                     zipOutputStream.Write(b, 0, b.Length);
    35                     f.Close();
    36                     if (isBakBeforeZip) //即时删除备份文件
    37                         File.Delete(fileName + ".bak");
    38                 }
    39             }
    40             zipOutputStream.Finish();
    41             zipOutputStream.Close();
    42             return zipFile;
    43         }

     4. 使用 ILMerge-GUI.exe 合并dll到Exe程序中。

        网络上很多介绍在命令行下使用 ILMerge合并dll和exe的教程,这里我就记录下怎么使用这个工具的吧。

    合并前:

                  

     

    需要将ICSharpCode.SharpZipLib.dll 合并到 ZipLogToEmail.exe 中,因为我想合并后依然使用“ZipLogToEmail.exe”这个名字,以便能访问到

    “ZipLogToEmail.exe.config”这个文件里的配置信息,所以先重命名 ZipLogToEmail.exe 为 ZipLogToEmailOld.exe,然后打开ILMerge-GUI.exe。

              

     合并后:

                

              合并后文件大小340≈ 184+163

    您可以直接下载合并后的执行文件,也可以下载源码再次进行开发。 

    2011-12-29:

    因有个网友需要在手机上接收邮件,查看附件就不方便了,于是我对原来的功能做了如下改进:

    1. 增加了默认主题和默认邮件内容配置项

        这样可以通过主题来区分不同的项目了

    2. 增加了日志发送类型配置项,1:发送附件  2:发送文件内容。 默认值:1

        大部分日志文件都是文本类型,也可以是一些小得数据库;当配置为发送文件内容时如果不是文本类型读出来是乱码

    3. 增加了判断文件从上次发送到当前时间有没有修改过的判断逻辑

       这样可以避免同样的内容发送多次的问题

    这次没有对文件进行合并,点击 这里下载可执行文件和配置说明,源文件

     

  • 相关阅读:
    2019-2020-2 网络对抗技术 20175217 Exp6 MSF基础应用
    2020_1课程设计—基于BC的证书格式转换工具的设计与实现—第二周进展
    2019-2020-2 网络对抗技术 20175217 Exp5 信息搜集与漏洞扫描
    2019-2020-2 网络对抗技术 20175217 Exp4 恶意代码分析
    2019-2020-2 网络对抗技术 20175205 Exp 9 Web安全基础
    2019-2020-2 网络对抗技术 20175205 Exp8 Web基础
    2019-2020-2 网络对抗技术 20175205 Exp7 网络欺诈防范
    2020_1课程设计—基于BC的证书格式转换工具的设计与实现—个人报告
    2020_1课程设计—基于BC的证书格式转换工具的设计与实现—Week3
    2019-2020-2 网络对抗技术 20175205 Exp6 MSF基础应用
  • 原文地址:https://www.cnblogs.com/zhaobl/p/2258960.html
Copyright © 2011-2022 走看看