在项目中使用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=
"
[email protected]
"/>
6 <!--发送账号-->
7 <add key=
"
SendUser
" value=
"
LogSend
"/>
8 <!--发送密码,使用时请输入真实的密码-->
9 <add key=
"
SendPwd
" value=
"
*********
"/>
10 <!--接收邮箱,多个邮箱时使用|分隔,第一个为接收邮箱其余为抄送邮箱-->
11 <add key=
"
ReceiveEmails
" value=
"
[email protected]
"/>
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. 增加了判断文件从上次发送到当前时间有没有修改过的判断逻辑
这样可以避免同样的内容发送多次的问题
这次没有对文件进行合并,点击 这里下载可执行文件和配置说明,源文件