博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
定时压缩日志文件并发送到邮箱
阅读量:4964 次
发布时间:2019-06-12

本文共 4471 字,大约阅读时间需要 14 分钟。

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

功能:

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

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

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

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

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

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

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

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

ExpandedBlockStart.gifApp.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. 发送邮件,用到了抄送和附件功能

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

ExpandedBlockStart.gif
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记录日志的系统中日志文件总是被应用进程占用的,所以不能直接压缩日志文件。

ExpandedBlockStart.gif
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. 使用 合并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. 增加了判断文件从上次发送到当前时间有没有修改过的判断逻辑

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

 

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

 

 

 

 

转载于:https://www.cnblogs.com/zhaobl/archive/2011/11/22/2258960.html

你可能感兴趣的文章
[POI2013]BAJ-Bytecomputer
查看>>
加油,加油
查看>>
开发流程
查看>>
UIPageViewController
查看>>
BeanUtils简化数据封装
查看>>
2017.4.25PM
查看>>
推箱子
查看>>
弹飞绵羊
查看>>
ecshop和ucenter的整合
查看>>
SQL中Group By的使用
查看>>
Python基础练习
查看>>
12 KLT算法
查看>>
fir.im Weekly - iOS/Android 应用程序架构解析
查看>>
堆表修改内幕
查看>>
egret之好友列表(滑动列表)
查看>>
树链剖分
查看>>
C语言中的setjmp和longjmp函数
查看>>
scala学习笔记3(trait)
查看>>
Apache Log4j使用实例
查看>>
Miller-Rabin判质数和Pollared-Rho因数分解
查看>>