c#實現(xiàn)服務(wù)器性能監(jiān)控并發(fā)送郵件保存日志
更新時間:2014年01月11日 10:35:50 作者:
這篇文章主要介紹了c#實現(xiàn)服務(wù)器性能監(jiān)控并發(fā)送郵件保存日志的示例,代碼分為客戶端和服務(wù)端,客戶端可安裝為本地服務(wù)形式啟動
客戶端代碼
復(fù)制代碼 代碼如下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.ServiceProcess;
using System.Text;
using System.Threading;
using System.Management;
using System.Configuration;
using System.Net;
using System.IO;
namespace MON.WS
{
public partial class Service : ServiceBase
{
//post 11.9
//卸載服務(wù)
//installutil /u F:\XLFX-2\XLFX\MON.WS\bin\debug\MON.WS.EXE
//安裝服務(wù)
//installutil F:\XLFX-2\XLFX\MON.WS\bin\debug\MON.WS.EXE
object threadObj;
Thread jobThread;
Dictionary<string, PerformanceCounter> dicCounter;
Dictionary<string, ManagementObject> dicDisk;
public Service()
{
InitializeComponent();
}
/// <summary>
/// 服務(wù)啟動
/// </summary>
/// <param name="args"></param>
protected override void OnStart(string[] args)
{
threadObj = new object();
dicCounter = new Dictionary<string, PerformanceCounter>();
dicDisk = new Dictionary<string, ManagementObject>();
jobThread = new Thread(new ThreadStart(Job));
jobThread.IsBackground = true;
jobThread.Start();
}
/// <summary>
/// 服務(wù)停止
/// </summary>
protected override void OnStop()
{
if (jobThread.IsAlive)
{
jobThread.Abort();
jobThread.Join();
}
foreach (var obj in dicCounter.Values)
{
obj.Dispose();
}
foreach (var obj in dicDisk.Values)
{
obj.Dispose();
}
dicDisk.Clear();
dicCounter.Clear();
}
/// <summary>
/// 監(jiān)控線程
/// </summary>
void Job()
{
while (true)
{
lock (threadObj)
{
//監(jiān)控開始
try
{
var obj = new MONServiceClient.MONService();
var hn = Dns.GetHostName();
var ips = GetIpv4Address(hn);
if (ips.Count < 1)
{
obj.Dispose();
Thread.Sleep(60000);//如果服務(wù)器出錯,那么就每分鐘去檢查一次
WriteLog("一個IPV4的地址也沒有得到");
continue;
}
DataSet ds = GetConfigDS(hn,ips,obj);
if (ds == null)
{
obj.Dispose();
Thread.Sleep(60000);
WriteLog("請檢查WEBService和全局變量設(shè)置");
continue;
}
int sleepTime;
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")
{
//監(jiān)控開關(guān)->關(guān)閉
obj.Dispose();
continue;
}
var arr = getWatchValue(ds).ToArray();
obj.UpdateServerStatus(arr);
obj.Dispose();
}
catch (Exception ex)
{
WriteLog(ex.Message);
}
//監(jiān)控結(jié)束
}
}
}
/// <summary>
/// 獲取配置信息
/// </summary>
/// <param name="ips"></param>
/// <returns></returns>
DataSet GetConfigDS(string hn,List<IPAddress> ips,MONServiceClient.MONService obj)
{
DataSet ds;
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;
}
return ds;
}
/// <summary>
/// 獲取性能數(shù)組
/// </summary>
/// <param name="ds"></param>
/// <returns></returns>
List<string> getWatchValue(DataSet ds)
{
var result = new List<string>();
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());
return result;
}
/// <summary>
/// 獲取IPV4的地址
/// </summary>
/// <param name="hn"></param>
/// <returns></returns>
List<IPAddress> GetIpv4Address(string hn)
{
var result = new List<IPAddress>();
var ips = Dns.GetHostAddresses(hn);
foreach (var ip in ips)
{
if (ip.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
{
result.Add(ip);
}
}
return result;
}
/// <summary>
/// 獲取性能計數(shù)器的值
/// </summary>
/// <param name="configStr"></param>
/// <returns></returns>
double GetValue(string configStr)
{
try
{
if (!dicCounter.ContainsKey(configStr))
{
var arr = configStr.Split('#');
var pc = new PerformanceCounter();
pc.CategoryName = arr[0];
pc.CounterName = arr[1];
pc.InstanceName = arr[2];
dicCounter.Add(configStr, pc);
}
return dicCounter[configStr].NextValue();
}
catch (Exception ex)
{
WriteLog(string.Format("計數(shù)器取值錯誤:{0}{1}{2}", configStr, Environment.NewLine, ex.Message));
return -1;
}
}
/// <summary>
/// 獲取磁盤信息的值
/// </summary>
/// <param name="key"></param>
/// <returns></returns>
double GetDiskValue(string key)
{
try
{
if (!dicDisk.ContainsKey(key))
{
ManagementObject DiskInfo = new ManagementObject(string.Format("win32_logicaldisk.deviceid=\"{0}\"", key));
dicDisk.Add(key, DiskInfo);
}
dicDisk[key].Get();
var s = Convert.ToDouble(dicDisk[key]["Size"]);
var l = Convert.ToDouble(dicDisk[key]["FreeSpace"]);
var d = (s - l) / s * 100;
return d;
}
catch (Exception ex)
{
WriteLog(string.Format("獲取磁盤信息值錯誤:{0}{1}{2}", key, Environment.NewLine, ex.Message));
return -1;
}
}
/// <summary>
/// 寫本地日志
/// </summary>
/// <param name="text"></param>
void WriteLog(string text)
{
try
{
var logDic = ConfigurationManager.AppSettings["LogDic"];
int logDays;
try
{
logDays = Convert.ToInt32(ConfigurationManager.AppSettings["LogDays"]);
}
catch
{
logDays = 7;
}
if (logDays < 1)
{
logDays = 7;
}
var fs = LogFileMon(logDic, logDays);
StreamWriter writer = new StreamWriter(fs);
writer.WriteLine(DateTime.Now.ToString());
writer.WriteLine(text);
writer.WriteLine("-----------------------------------------------------------");
writer.Flush();
writer.Close();
fs.Close();
}
catch
{
//寫日志出錯就沒辦法了
}
}
/// <summary>
/// 維護日志文件
/// </summary>
/// <param name="logDic"></param>
/// <param name="days"></param>
FileStream LogFileMon(string logDic, int dayCount)
{
DirectoryInfo di = new DirectoryInfo(logDic);
//如果日志文件夾不存在則創(chuàng)建日志文件夾;
if (!di.Exists)
{
di.Create();
}
//當(dāng)前應(yīng)保存的日志數(shù)據(jù)
List<string> days = new List<string>();
for (var i = 0; i < dayCount; i++)
{
var d = DateTime.Now.AddDays(0 - i).ToString("yyyy-MM-dd");
days.Add(string.Format("{0}.log", d));
}
//刪除沒用的歷史數(shù)據(jù)
foreach (var f in di.GetFiles())
{
if (!days.Contains(f.Name))
{
f.Delete();
}
}
//返回當(dāng)前日志文件的數(shù)據(jù)流
var fileName = Path.Combine(logDic, days[0]);
var fs = File.Open(fileName, FileMode.Append,FileAccess.Write);
return fs;
}
}
}
服務(wù)端代碼
復(fù)制代碼 代碼如下:
Imports System.Web.Services
Imports System.Web.Services.Protocols
Imports System.ComponentModel
Imports System.Threading
Imports System.Collections.Generic
Imports System.Text
' 若要允許使用 ASP.NET AJAX 從腳本中調(diào)用此 Web 服務(wù),請取消對下行的注釋。
' <System.Web.Script.Services.ScriptService()> _
<System.Web.Services.WebService(Namespace:="http://tempuri.org/")> _
<System.Web.Services.WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _
<ToolboxItem(False)> _
Public Class MONService
Inherits System.Web.Services.WebService
<WebMethod()> _
Public Function GetMachineConfig(ByVal HostName As String, ByVal IP1 As String, ByVal IP2 As String) As DataSet
Dim sqlda As New data_source.WebTao.Public.SqlServerData
Try
Dim sSQL As String = "select * from mon_server_list " & _
" where S_HOSTNAME ='" & HostName & "' and IP1 = '" & IP1 & "' and IP2 = '" & IP2 & "'"
Dim dt As DataTable = sqlda.GetMytable(sSQL)
If dt.Rows.Count < 1 Then
sqlda.runSql("insert into mon_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("INSERT INTO [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() & "') ")
End If
Dim result As DataSet = sqlda.GetMyDataSet("select * from MON_PARAMETER")
result.Tables.Add(dt)
Return result
Catch ex As Exception
Return Nothing
End Try
End Function
<WebMethod()> _
Public Function UpdateServerStatus(ByVal ParamArray ValueArr() As String)
Dim sqlda As New data_source.WebTao.Public.SqlServerData
Try
Dim sSQL As String = "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() & "'" & _
" WHERE LIST_ID = " & ValueArr(0)
sqlda.runSql(sSQL)
'沒有策略
If ValueArr(9).Trim() = "-1" Or String.IsNullOrEmpty(ValueArr(9).Trim()) Then
Return 0
End If
'找到策略
sSQL = "select * from MON_CAMPAIGN_LIST where CAMP_ID = " & ValueArr(9)
Dim dt As DataTable = sqlda.GetMytable(sSQL)
Dim Dic As New Dictionary(Of String, String)
Dic.Add("S_PRIORITY", dt.Rows(0)("S_PRIORITY").ToString())
Dic.Add("S_ACTION", dt.Rows(0)("S_ACTION").ToString())
'驗證策略
sSQL = "select count(*) from MON_INFO where 1=1 and " & dt.Rows(0)("S_NAME").ToString & " and LIST_ID = " & ValueArr(0)
Dim FLAG = CType(sqlda.myExecuteScalar(sSQL), Integer)
'沒有超標(biāo)
If FLAG < 1 Then
Return 0
End If
'是否到了下一個輪訓(xùn)間隔
sSQL = "select TOP 1 * from [MON_MAIL] WHERE list_id = " & ValueArr(0) & " ORDER BY S_SENDTIME DESC "
dt = sqlda.GetMytable(sSQL)
Dim ts As TimeSpan = TimeSpan.MaxValue
If dt.Rows.Count > 0 Then
Dim thatTime As DateTime = CType(dt.Rows(0)("S_SENDTIME"), DateTime)
ts = DateTime.Now.Subtract(thatTime)
End If
sSQL = "select * from MON_PARAMETER"
dt = sqlda.GetMytable(sSQL)
Dim circ As Integer = CType(dt.Rows(0)("MAIL_CIRC"), Integer)
If ts.TotalSeconds < circ Then
Return 0
End If
'異步發(fā)信
Dic.Add("S_TITLE", dt.Rows(0)("S_TITLE").ToString())
Dic.Add("MAIL_SMTP_SERVER", dt.Rows(0)("MAIL_SMTP_SERVER").ToString())
Dic.Add("MAIL_ACCOUNT", dt.Rows(0)("MAIL_ACCOUNT").ToString())
Dic.Add("MAIL_PASSWORD", dt.Rows(0)("MAIL_PASSWORD").ToString())
Dic.Add("MAIL_FROM", dt.Rows(0)("MAIL_FROM").ToString())
Dic.Add("MAIL_ADDRESS", dt.Rows(0)("MAIL_ADDRESS").ToString())
Dim sout As Double
Dim sin As Double
Try
sin = Convert.ToDouble(ValueArr(5)) / 1024.0
sout = Convert.ToDouble(ValueArr(6)) / 1024.0
Catch ex As Exception
sin = -1
sout = -1
End Try
Dim sb As New StringBuilder()
sb.AppendFormat("CPU使用率:{0}%<br />", ValueArr(1))
sb.AppendFormat("內(nèi)存使用率:{0}%<br />", ValueArr(4))
sb.AppendFormat("系統(tǒng)磁盤使用率:{0}%<br />", ValueArr(3))
sb.AppendFormat("文件磁盤使用率:{0}%<br />", ValueArr(2))
sb.AppendFormat("網(wǎng)絡(luò)下行流量IN:{0}KB/S<br />", sin.ToString())
sb.AppendFormat("網(wǎng)絡(luò)上行流量OUT:{0}KB/S<br />", sout.ToString())
sb.AppendFormat("網(wǎng)站連接數(shù):{0}<br />", ValueArr(7))
sb.AppendFormat("數(shù)據(jù)庫連接數(shù):{0}<br />", ValueArr(8))
Dim subject As String = String.Format("人力運營管理系統(tǒng)監(jiān)控告警:{0}{1}", ValueArr(10), IIf(ValueArr(11) = "0", "WEB服務(wù)器", "數(shù)據(jù)庫服務(wù)器"))
Dim body As String = String.Format("{0}<br />{1}<br />{2}<br />{3}<br />{4}", DateTime.Now.ToString(), Dic("S_PRIORITY"), Dic("S_TITLE"), sb.ToString(), Dic("S_ACTION"))
'TODO:oracle不支持~select @@identity
sSQL = "INSERT INTO [MON_MAIL] ([LIST_ID] ,[S_SOURCE] ,[S_CONTENT] ,[S_ACTION] ,[S_PRIORITY] ,[S_ADDRESS] ,[STATUS] ,[S_SENDTIME]) VALUES " & _
"(" & ValueArr(0) & ",'" & Dic("S_TITLE") & "','" & sb.ToString() & "','" & Dic("S_ACTION") & "','" & Dic("S_PRIORITY") & "','" & dt.Rows(0)("MAIL_ADDRESS").ToString() & "',0,'" & DateTime.Now.ToString() & "');select @@identity"
Dim index As Integer = CType(sqlda.myExecuteScalar(sSQL), Integer)
Dic.Add("SUBJECT", subject)
Dic.Add("BODY", body)
Dic.Add("INDEX", index)
Dic.Add("CONSTR", sqlda.GetMyConnStr())
ThreadPool.QueueUserWorkItem(AddressOf SendMail, Dic)
Catch ex As Exception
End Try
End Function
Function SendMail(ByVal setting As Object) As Integer
Try
Dim Dic As Dictionary(Of String, String) = CType(setting, Dictionary(Of String, String))
Dim iSmtpSetting As New PublicFunction.SmtpSetting
iSmtpSetting.SmtpServer = Dic("MAIL_SMTP_SERVER")
iSmtpSetting.SystemEmailAccount = Dic("MAIL_ACCOUNT")
iSmtpSetting.SystemEmailAccountPassword = Dic("MAIL_PASSWORD")
iSmtpSetting.SmtpAuthenticationType = 1
Dim result As Boolean = PublicFunction.Mail.SendMail(iSmtpSetting, Dic("MAIL_FROM"), Dic("MAIL_ADDRESS"), Dic("SUBJECT"), Dic("BODY"), True, System.Web.Mail.MailPriority.High, System.Text.Encoding.UTF8, New String() {})
Dim val As Integer = IIf(result, 1, 2)
Dim sqlda As New data_source.WebTao.Public.SqlServerData(Dic("CONSTR"))
sqlda.runSql("update MON_MAIL set STATUS = " & val & " where MAIL_ID = " & Dic("INDEX"))
Catch ex As Exception
End Try
End Function
End Class
您可能感興趣的文章:
- c# 兩種發(fā)送郵件的方法
- c# 實現(xiàn)發(fā)送郵件到指定郵箱
- c# 實現(xiàn)發(fā)送郵件的功能
- C# 服務(wù)器發(fā)送郵件失敗實例分析
- C#實現(xiàn)QQ郵箱發(fā)送郵件
- C#實現(xiàn)發(fā)送郵件的方法
- C# SendMail發(fā)送郵件功能實現(xiàn)
- 通過C#實現(xiàn)發(fā)送自定義的html格式郵件
- C#實現(xiàn)的自定義郵件發(fā)送類完整實例(支持多人多附件)
- C#編程實現(xiàn)發(fā)送郵件的方法(可添加附件)
- C#實現(xiàn)發(fā)送郵件的三種方法
- c#利用system.net發(fā)送html格式郵件
- c#調(diào)用qq郵箱smtp發(fā)送郵件修改版代碼分享
- C#調(diào)用QQ_Mail發(fā)送郵件實例代碼兩例
相關(guān)文章
C#遞歸實現(xiàn)顯示文件夾及所有文件并計算其大小的方法
這篇文章主要介紹了C#遞歸實現(xiàn)顯示文件夾及所有文件并計算其大小的方法,是遍歷算法中比較典型的一種應(yīng)用,有不錯的學(xué)習(xí)借鑒價值,需要的朋友可以參考下2014-08-08C#如何利用結(jié)構(gòu)體對固定格式數(shù)據(jù)進行解析
這篇文章主要為大家詳細介紹了C#利用結(jié)構(gòu)體對固定格式數(shù)據(jù)進行解析,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-01-01