最近在做一個小的項目,是web的應用程序,最近也有點時間,把日志管理來簡單的說說.
日志,就是需要記錄一些自己感興趣的信息,把它保存起來,具體保存在哪里?保存多長時間?這些要求都是根據不同的項目需求而定的.
首先說說保存在哪里?一般是服務器,或者客戶端上,如果再細分:可以是數據庫,系統的log系統中,文件中,再或者session或application中存儲,甚至頁面的隱藏字段中,或程序的隱藏區域中,個人認為在頁面或程序的隱藏區域,你可以使用"彩蛋"的形式比較好,即隱蔽又可以呈現給需要看到的人.
今天只說說其中的一部分,沒說的留到以后再慢慢完善.
應用程序肯定用到了數據庫,所以把日志寫到數據庫也就是多一張表的事.如果你可以使用DBSM客戶端連接到數據庫,就可以查看完整的日志信息。
先創建個表吧!
-- create table create table t_systemlog ( id number(19) not null,--id字段,沒什么好說的 userid varchar2(9) not null,--用戶ID,可以知道是那個用戶操作的 titleName varchar2(50) not null,--暫時沒用到,可以存標題,或者用戶的角色 ipaddress varchar2(15) not null,--IP地址,一般是用戶的IP地址 ipproxy varchar2(15),--IP代理設置的,一般是用戶的IP代理地址 moudle varchar2(20) not null,--日志是發生在哪個模塊的。 submoudle varchar2(100),--日志發生的子模塊 source varchar2(400) not null,--日志發生源,一般可以追溯到是在哪個文件里發生的日志 event varchar2(500),--在文件的那個事件中發生的日志,一般日志都是事件驅動型的 comments varchar2(1300),--日志的具體內容 logtime date default (sysdate) not null--日志的寫入時間,一般在數據庫中取時間,方便統一,防止不同時區的用戶時間不一樣 )
字段的說明我在上面都已經標注了,這里就不說了,也許你還有更好的設計字段,你也可以提出來,大家一起討論。
程序中保存一條記錄的功能我就不說了,你做數據庫的應用程序肯定知道怎么做。
我前面也說了,由於做的是一個web系統的應用程序,不想每次都去查數據庫,所以我想在頁面上就可以看的日志信息,所以我又多寫個直接輸出到頁面的功能。
先看看下面的程序:
'**** jack edit : Add Write log
sub jackWriteLog(strMsg,logMod)
select case logMod
case 0 '表示隱藏寫到頁面
Response.write(vbnewline+vbnewline+"<!-- jack edit log start"+vbnewline+vbnewline)
Response.write(" " & strMsg)
Response.write(vbnewline+vbnewline+"jack edit log end -->"+vbnewline+vbnewline)
case 1 '表示不使用隱藏寫到頁面上
Response.write(vbnewline+vbnewline+"<!-- jack edit log start -->"+vbnewline+vbnewline)
Response.write(" " & strMsg)
Response.write(vbnewline+vbnewline+"<!-- jack edit log end -->"+vbnewline+vbnewline)
case 2 '表示javascript彈出窗口顯示
Response.write(vbnewline+vbnewline+"<!-- jack edit log start -->"+vbnewline+vbnewline)
Response.write(vbnewline+"<script>"+vbnewline)
Response.write(" alert('" & strMsg & "');")
Response.write(vbnewline+"</script>"+vbnewline)
Response.write(vbnewline+vbnewline+"<!-- jack edit log end -->"+vbnewline+vbnewline)
case else '表示寫入數據庫
Call WriteLog("jack","test","jack edit",strMsg)
end select
End sub
當logMod為0時是隱藏輸出到頁面,當為1時是可見輸出到頁面,當為2時用JS彈出提示框,其他就直接寫到數據庫中。
今天就先說到這里吧,后面還有事要忙,今天寫這些主要是告訴大家一個系統有哪些組成,如何方便需要的人查看日志,這里只是希望告訴你一個框架,具體的功能大家都不一樣,實現的方式不一樣,實現的開發語言不一樣,但是記錄log的理念是一樣的,目的是一樣的。所以我們可以舉一反三,多從別人的系統中尋求好的東西拿來為我所用。
上面的日志程序可以說是個框架,在這個框架上如何擴展,一般是要看項目的需要,今天我就把我的代碼列出來:

<% Dim j_conn,j_connProvider,j_DbName Set j_conn = Server.CreateObject("ADODB.Connection") j_connProvider = "Provider=OraOLEDB.Oracle;User Id='dbuser';Password='dbpass';PLSQLRSet=1;Persist Security Info=true;data Source=" j_DbName = "(description=(address_list= (address=(host=3.3.8.8) (protocol=tcp)(port=1521))(address=(host=3.3.8.9)(protocol=tcp)(port=1521)) (failover=true))(connect_data=(service_name=dbName)))" j_conn.Open(j_connProvider & j_DbName) '************************************************************************** ' Parameters: None ' Author: Sun Feng ' Return Value: Client IP Address ' Non-local Variables: Request.ServerVariables ' Description: Get client IP '************************************************************************** Function GetIP() Dim strIPAddr If Request.ServerVariables("HTTP_X_FORWARDED_FOR") = "" OR InStr(Request.ServerVariables("HTTP_X_FORWARDED_FOR"),"unknown") > 0 Then strIPAddr = Request.ServerVariables("REMOTE_ADDR") ElseIf InStr(Request.ServerVariables("HTTP_X_FORWARDED_FOR"), ",") > 0 Then strIPAddr = Mid(Request.ServerVariables("HTTP_X_FORWARDED_FOR"), 1, InStr(Request.ServerVariables("HTTP_X_FORWARDED_FOR"), ",")-1) ElseIf InStr(Request.ServerVariables("HTTP_X_FORWARDED_FOR"), ";") > 0 Then strIPAddr = Mid(Request.ServerVariables("HTTP_X_FORWARDED_FOR"), 1, InStr(Request.ServerVariables("HTTP_X_FORWARDED_FOR"), ";")-1) Else strIPAddr = Request.ServerVariables("HTTP_X_FORWARDED_FOR") End If GetIP = Trim(Mid(strIPAddr, 1, 30)) End Function '************************************************************************** ' Parameters: None ' Author: Sun Feng ' Return Value: Client Proxy IP Address ' Non-local Variables: Request.ServerVariables ' Description: Get client Proxy IP '************************************************************************** Function GetProxyIP() Dim strIPAddr If Request.ServerVariables("HTTP_X_FORWARDED_FOR") = "" OR InStr(Request.ServerVariables("HTTP_X_FORWARDED_FOR"), "unknown") > 0 Then strIPAddr="unknown" Else strIPAddr=Request.ServerVariables("REMOTE_ADDR") End if GetProxyIP=Trim(Mid(strIPAddr, 1, 30)) End Function '************************************************************************** ' Parameters: Moudle name, Sub Moudle name, Event, Comments ' Author: Sun Feng ' Return Value: None ' Non-local Variables: Request.ServerVariables ' Description: Record data modify '************************************************************************** Sub WriteLog(strMdl,strSubMdl,strEvent,strCmt) Dim sql,strURL strURL=replace(Request.ServerVariables("PATH_INFO"),"'","''") strMdl=replace(strMdl,"'","''") strSubMdl=replace(strSubMdl,"'","''") strEvent=replace(strEvent,"'","''") strCmt=replace(strCmt,"'","''") sql="insert into sys_SystemLog (UserID,TrackTime,TitleName,IPAddress,Proxy,Moudle,SubMoudle,Source,Event,Comments)" & _ " values (NVL('" & session("gessouid") & "',' '),'" & now() & "',NVL('" & session("titleName") & "',' ')," & _ "'" & GetIP() & "','" & GetProxyIP() & "'," & _ "'" & strMdl & "','" & strSubMdl & "','" & strURL & "','" & strEvent & "','" & strCmt & "')" j_conn.execute(sql) End Sub '************************************************************************** ' Parameters: ' strMsg: Output message or Database Comments ' logMod: log mode,the values is :0,1,2,other ' Author: Jack Meng ' Return Value: None ' Non-local Variables: Request.ServerVariables ' Description: Test Write log, can be used for breakpoint execution, ' but need to modify stopDebug=1 and logMod = 1 '************************************************************************** sub jackWriteLog(strMsg,logMod) Dim stopDebug stopDebug=0 select case logMod case 0 '表示信息是隱藏寫到頁面 Response.write(vbnewline & vbnewline & "<!-- jack edit log start" & vbnewline & vbnewline) Response.write(" " & strMsg) Response.write(vbnewline & vbnewline & "jack edit log end -->" & vbnewline & vbnewline) case 1 '表示信息是直接寫到頁面上顯示出來 Response.write(vbnewline & vbnewline & "<!-- jack edit log start -->" & vbnewline & vbnewline) Response.write(" " & strMsg) Response.write(vbnewline & vbnewline & "<!-- jack edit log end -->" & vbnewline & vbnewline) If stopDebug then Response.End End if case 2 '表示信息是通過javascript的彈出窗口顯示出來 Response.write(vbnewline & vbnewline & "<!-- jack edit log start -->" & vbnewline & vbnewline) Response.write(vbnewline & "<script language=""javascript"">" & vbnewline) Response.write(" alert(""" & strMsg & """);") Response.write(vbnewline & "</script>" & vbnewline) Response.write(vbnewline & vbnewline & "<!-- jack edit log end -->" & vbnewline & vbnewline) case else '表示信息寫入數據庫,並在頁面隱藏提示"日志信息已寫到數據庫" Call WriteLog("jack","jack edit","jack test",strMsg) Call jackWriteLog(strMsg & vbnewline & " The log has been saved to the database!",0) end select End sub %>
另外,我自己寫了個.NET的文件記錄日志的類,使用多線程、堆棧等相關技術,可參考下載:LogFileHelper.rar(已上傳)
聲明:文件下載鏈接已被我取消。本文章只是自己的記錄方便自己使用,但被某些人作它用。
也許你認為我的程序都是從書上或網上很多地方都可以找到。最起碼我把所有代碼整合,可以正常工作。你也可以去其他網上找,沒人強求。
如果想要程序的提供郵箱,根據文章下面的 “打賞” 並備注打賞賬號,金額隨意!1元不閑少1千不算多,算是對我勞動的肯定與支持。
以上文章純屬自己手動輸入,個人所寫,如轉載,請注明出處!