web應用程序 ---- 日志系統的設計


最近在做一個小的項目,是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

%>
View Code

 

另外,我自己寫了個.NET的文件記錄日志的類,使用多線程、堆棧等相關技術,可參考下載:LogFileHelper.rar(已上傳)

聲明:文件下載鏈接已被我取消。本文章只是自己的記錄方便自己使用,但被某些人作它用。
也許你認為我的程序都是從書上或網上很多地方都可以找到。最起碼我把所有代碼整合,可以正常工作。你也可以去其他網上找,沒人強求。
如果想要程序的提供郵箱,根據文章下面的 “打賞”  並備注打賞賬號,金額隨意!1元不閑少1千不算多,算是對我勞動的肯定與支持。

以上文章純屬自己手動輸入,個人所寫,如轉載,請注明出處!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM