c实现服务器性能监控并发送邮件保存日志课案.docx
- 文档编号:8964217
- 上传时间:2023-02-02
- 格式:DOCX
- 页数:20
- 大小:19.48KB
c实现服务器性能监控并发送邮件保存日志课案.docx
《c实现服务器性能监控并发送邮件保存日志课案.docx》由会员分享,可在线阅读,更多相关《c实现服务器性能监控并发送邮件保存日志课案.docx(20页珍藏版)》请在冰豆网上搜索。
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;
Dictionary
Dictionary
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,List
{
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;
}
///
///获取性能数组
///
///
///
List
{
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的地址
///
///
///
List
{
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();
}
//当前应保存的日志数据
List
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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实现 服务器 性能 监控 发送 邮件 保存 日志
![提示](https://static.bdocx.com/images/bang_tan.gif)