zoukankan      html  css  js  c++  java
  • 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千不算多,算是对我劳动的肯定与支持。

    以上文章纯属自己手动输入,个人所写,如转载,请注明出处!

  • 相关阅读:
    几种数据结构的查找、删除、插入的时间复杂度(数组 链表 二叉查找树 平衡二叉查找树 哈希表)
    java 多线程的状态迁移 常用线程方法分析
    JVM内存分区
    详解 Java I/O 与装饰者模式
    详解 java 异常
    ExecutorService 线程池详解
    CG group
    VIM 配置python
    Q35+uefi or bios+legacy // PCI | PCIE
    硬盘接口协议
  • 原文地址:https://www.cnblogs.com/mq0036/p/6164571.html
Copyright © 2011-2022 走看看