c实现服务器性能监控并发送邮件保存日志课案.docx
《c实现服务器性能监控并发送邮件保存日志课案.docx》由会员分享,可在线阅读,更多相关《c实现服务器性能监控并发送邮件保存日志课案.docx(20页珍藏版)》请在冰豆网上搜索。
![c实现服务器性能监控并发送邮件保存日志课案.docx](https://file1.bdocx.com/fileroot1/2023-2/2/7ec53ed2-2436-4e0c-bb88-963536ded52b/7ec53ed2-2436-4e0c-bb88-963536ded52b1.gif)
c实现服务器性能监控并发送邮件保存日志课案
c#实现服务器性能监控并发送邮件保存日志
这篇文章主要介绍了c#实现服务器性能监控并发送邮件保存日志的示例,代码分为客户端和服务端,客户端可安装为本地服务形式启动
客户端代码
复制代码代码如下:
usingSystem;
usingSystem.Collections.Generic;
usingSystem.ComponentModel;
usingSystem.Data;
usingSystem.Diagnostics;
usingSystem.ServiceProcess;
usingSystem.Text;
usingSystem.Threading;
usingSystem.Management;
usingSystem.Configuration;
usingSystem.Net;
usingSystem.IO;
namespaceMON.WS
{
publicpartialclassService:
ServiceBase
{
//post11.9
//卸载服务
//installutil/uF:
\XLFX-2\XLFX\MON.WS\bin\debug\MON.WS.EXE
//安装服务
//installutilF:
\XLFX-2\XLFX\MON.WS\bin\debug\MON.WS.EXE
objectthreadObj;
ThreadjobThread;
DictionarydicCounter;
DictionarydicDisk;
publicService()
{
InitializeComponent();
}
///
///服务启动
///
///
protectedoverridevoidOnStart(string[]args)
{
threadObj=newobject();
dicCounter=newDictionary();
dicDisk=newDictionary();
jobThread=newThread(newThreadStart(Job));
jobThread.IsBackground=true;
jobThread.Start();
}
///
///服务停止
///
protectedoverridevoidOnStop()
{
if(jobThread.IsAlive)
{
jobThread.Abort();
jobThread.Join();
}
foreach(varobjindicCounter.Values)
{
obj.Dispose();
}
foreach(varobjindicDisk.Values)
{
obj.Dispose();
}
dicDisk.Clear();
dicCounter.Clear();
}
///
///监控线程
///
voidJob()
{
while(true)
{
lock(threadObj)
{
//监控开始
try
{
varobj=newMONServiceClient.MONService();
varhn=Dns.GetHostName();
varips=GetIpv4Address(hn);
if(ips.Count<1)
{
obj.Dispose();
Thread.Sleep(60000);//如果服务器出错,那么就每分钟去检查一次
WriteLog("一个IPV4的地址也没有得到");
continue;
}
DataSetds=GetConfigDS(hn,ips,obj);
if(ds==null)
{
obj.Dispose();
Thread.Sleep(60000);
WriteLog("请检查WEBService和全局变量设置");
continue;
}
intsleepTime;
try
{
sleepTime=Convert.ToInt32(ds.Tables[0].Rows[0]["LOG_CIRC"])*1000;//毫秒
}
catch
{
sleepTime=60000;
}
if(sleepTime<1)
{
sleepTime=60000;
}
Thread.Sleep(sleepTime);
if(ds.Tables[1].Rows[0]["S_ISWATCH"].ToString()=="0")
{
//监控开关->关闭
obj.Dispose();
continue;
}
vararr=getWatchValue(ds).ToArray();
obj.UpdateServerStatus(arr);
obj.Dispose();
}
catch(Exceptionex)
{
WriteLog(ex.Message);
}
//监控结束
}
}
}
///
///获取配置信息
///
///
///
DataSetGetConfigDS(stringhn,Listips,MONServiceClient.MONServiceobj)
{
DataSetds;
try
{
if(ips.Count>1)
{
ds=obj.GetMachineConfig(hn,ips[0].ToString(),ips[1].ToString());
}
else
{
ds=obj.GetMachineConfig(hn,ips[0].ToString(),"");
}
}
catch
{
ds=null;
}
returnds;
}
///
///获取性能数组
///
///
///
ListgetWatchValue(DataSetds)
{
varresult=newList();
result.Add(ds.Tables[1].Rows[0]["LIST_ID"].ToString());
result.Add(GetValue(ds.Tables[1].Rows[0]["S_CPU"].ToString()).ToString("F2"));
result.Add(GetDiskValue(ds.Tables[1].Rows[0]["S_DISK_APP"].ToString()).ToString("F2"));
result.Add(GetDiskValue(System.Environment.SystemDirectory.Substring(0,2)).ToString("F2"));
result.Add(GetValue(ds.Tables[1].Rows[0]["S_MEMORY"].ToString()).ToString("F2"));
result.Add(GetValue(ds.Tables[1].Rows[0]["S_FLOW_IN"].ToString()).ToString("F2"));
result.Add(GetValue(ds.Tables[1].Rows[0]["S_FLOW_OUT"].ToString()).ToString("F2"));
result.Add(GetValue(ds.Tables[1].Rows[0]["S_WEB_PORT"].ToString()).ToString("F2"));
result.Add(GetValue(ds.Tables[1].Rows[0]["S_SQL_CONNECT"].ToString()).ToString("F2"));
result.Add(ds.Tables[1].Rows[0]["CAMP_ID"].ToString());
result.Add(ds.Tables[1].Rows[0]["CICODE"].ToString());
result.Add(ds.Tables[1].Rows[0]["S_KIND"].ToString());
returnresult;
}
///
///获取IPV4的地址
///
///
///
ListGetIpv4Address(stringhn)
{
varresult=newList();
varips=Dns.GetHostAddresses(hn);
foreach(varipinips)
{
if(ip.AddressFamily==System.Net.Sockets.AddressFamily.InterNetwork)
{
result.Add(ip);
}
}
returnresult;
}
///
///获取性能计数器的值
///
///
///
doubleGetValue(stringconfigStr)
{
try
{
if(!
dicCounter.ContainsKey(configStr))
{
vararr=configStr.Split('#');
varpc=newPerformanceCounter();
pc.CategoryName=arr[0];
pc.CounterName=arr[1];
pc.InstanceName=arr[2];
dicCounter.Add(configStr,pc);
}
returndicCounter[configStr].NextValue();
}
catch(Exceptionex)
{
WriteLog(string.Format("计数器取值错误:
{0}{1}{2}",configStr,Environment.NewLine,ex.Message));
return-1;
}
}
///
///获取磁盘信息的值
///
///
///
doubleGetDiskValue(stringkey)
{
try
{
if(!
dicDisk.ContainsKey(key))
{
ManagementObjectDiskInfo=newManagementObject(string.Format("win32_logicaldisk.deviceid=\"{0}\"",key));
dicDisk.Add(key,DiskInfo);
}
dicDisk[key].Get();
vars=Convert.ToDouble(dicDisk[key]["Size"]);
varl=Convert.ToDouble(dicDisk[key]["FreeSpace"]);
vard=(s-l)/s*100;
returnd;
}
catch(Exceptionex)
{
WriteLog(string.Format("获取磁盘信息值错误:
{0}{1}{2}",key,Environment.NewLine,ex.Message));
return-1;
}
}
///
///写本地日志
///
///
voidWriteLog(stringtext)
{
try
{
varlogDic=ConfigurationManager.AppSettings["LogDic"];
intlogDays;
try
{
logDays=Convert.ToInt32(ConfigurationManager.AppSettings["LogDays"]);
}
catch
{
logDays=7;
}
if(logDays<1)
{
logDays=7;
}
varfs=LogFileMon(logDic,logDays);
StreamWriterwriter=newStreamWriter(fs);
writer.WriteLine(DateTime.Now.ToString());
writer.WriteLine(text);
writer.WriteLine("-----------------------------------------------------------");
writer.Flush();
writer.Close();
fs.Close();
}
catch
{
//写日志出错就没办法了
}
}
///
///维护日志文件
///
///
///
FileStreamLogFileMon(stringlogDic,intdayCount)
{
DirectoryInfodi=newDirectoryInfo(logDic);
//如果日志文件夹不存在则创建日志文件夹;
if(!
di.Exists)
{
di.Create();
}
//当前应保存的日志数据
Listdays=newList();
for(vari=0;i{
vard=DateTime.Now.AddDays(0-i).ToString("yyyy-MM-dd");
days.Add(string.Format("{0}.log",d));
}
//删除没用的历史数据
foreach(varfindi.GetFiles())
{
if(!
days.Contains(f.Name))
{
f.Delete();
}
}
//返回当前日志文件的数据流
varfileName=Path.Combine(logDic,days[0]);
varfs=File.Open(fileName,FileMode.Append,FileAccess.Write);
returnfs;
}
}
}
服务端代码
复制代码代码如下:
ImportsSystem.Web.Services
ImportsSystem.Web.Services.Protocols
ImportsSystem.ComponentModel
ImportsSystem.Threading
ImportsSystem.Collections.Generic
ImportsSystem.Text
'若要允许使用ASP.NETAJAX从脚本中调用此Web服务,请取消对下行的注释。
'_
="http:
//tempuri.org/")>_
=WsiProfiles.BasicProfile1_1)>_
_
PublicClassMONService
InheritsSystem.Web.SWebService
_
PublicFunctionGetMachineConfig(ByValHostNameAsString,ByValIP1AsString,ByValIP2AsString)AsDataSet
DimsqldaAsNewdata_source.WebTao.Public.SqlServerData
Try
DimsSQLAsString="select*frommon_server_list"&_
"whereS_HOSTNAME='"&HostName&"'andIP1='"&IP1&"'andIP2='"&IP2&"'"
DimdtAsDataTable=sqlda.GetMytable(sSQL)
Ifdt.Rows.Count<1Then
sqlda.runSql("insertintomon_server_list(S_HOSTNAME,IP1,IP2,S_ISWATCH,CICODE,S_NAME,CAMP_ID,S_KIND,STATUS)values('"&HostName&"','"&IP1&"','"&IP2&"',0,'待确定','待确定',-1,0,0)")
dt=sqlda.GetMytable(sSQL)
sqlda.runSql("INSERTINTO[MON_INFO]([LIST_ID],[S_CPU],[S_DISK_APP],[S_DISK_SYS],[S_MEMORY],[S_FLOW_IN],[S_FLOW_OUT],[S_WEB_PORT],[S_SQL_CONNECT],[IN_TIME])VALUES("&dt.Rows(0)("LIST_ID").ToString()&",-1,-1,-1,-1,-1,-1,-1,-1,'"&Now.ToString()&"')")
EndIf
DimresultAsDataSet=sqlda.GetMyDataSet("select*fromMON_PARAMETER")
result.Tables.Add(dt)
Returnresult
CatchexAsException
ReturnNothing
EndTry
EndFunction
_
PublicFunctionUpdateServerStatus(ByValParamArrayValueArr()AsString)
DimsqldaAsNewdata_source.WebTao.Public.SqlServerData
Try
DimsSQLAsString="UPDATE[MON_INFO]"&_
"SET"&_
"[S_CPU]="&ValueArr
(1)&_
",[S_DISK_APP]="&ValueArr
(2)&_
",[S_DISK_SYS]="&ValueArr(3)&_
",[S_MEMORY]="&ValueArr(4)&_
",[S_FLOW_IN]="&ValueArr(5)&_
",[S_FLOW_OUT]="&ValueArr(6)&_
",[S_WEB_PORT]="&ValueArr(7)&_
",[S_SQL_CONNECT]="&ValueArr(8)&_
",[IN_TIME]='"&Now.ToString()&"'"&_
"WHERELIST_ID="&ValueArr(0)
sqlda.runSql(sSQL)
'没有策略
IfValueArr(9).Trim()="-1"OrString.IsNullOrEmpty(ValueArr(9).Trim())Then
Return0
EndIf
'找到策略
sSQL="select*fromMON_CAMPAIGN_LISTwhereCAMP_ID="&ValueArr(9)
DimdtAsDataTable=sqlda.GetMytable(sSQL)
DimDicAsNewDictionary(OfString,String)
Dic.Add("S_PRIORITY",dt.Rows(0)("S_PRIORITY").ToString())
Dic.Add("S_ACTION",dt.Rows(0)("S_ACTION").ToString())
'验证策略
sSQL="selectcount(*)fromMON_INFOwhere1=1and"&dt.Rows(0)("S_NAME").ToString&"an