335 lines
12 KiB
VB.net
335 lines
12 KiB
VB.net
|
|
Imports UTS_Core.Database
|
|||
|
|
Imports UTS_Core.UTSModule
|
|||
|
|
Imports UTS_Core.UTSModule.DbConnect
|
|||
|
|
Imports UTS_Core.UTSModule.DbTableModel.Manage
|
|||
|
|
|
|||
|
|
Public Class ServiceLog
|
|||
|
|
|
|||
|
|
Private Shared ReadOnly LogLock As New Object()
|
|||
|
|
|
|||
|
|
Private Shared ReadOnly LogQueue As New List(Of Dictionary(Of String, String))
|
|||
|
|
|
|||
|
|
''' <summary>厂商名</summary>
|
|||
|
|
Public Shared VendorName As String
|
|||
|
|
|
|||
|
|
''' <summary>公网IP</summary>
|
|||
|
|
Public Shared PublicIp As String
|
|||
|
|
|
|||
|
|
''' <summary>本地IP</summary>
|
|||
|
|
Public Shared PrivateIp As String
|
|||
|
|
|
|||
|
|
''' <summary>本地MAC地址</summary>
|
|||
|
|
Public Shared MAC As String
|
|||
|
|
|
|||
|
|
''' <summary>服务索引</summary>
|
|||
|
|
Public Shared DsIndex As Integer
|
|||
|
|
|
|||
|
|
''' <summary>数据服务版本</summary>
|
|||
|
|
Public Shared DsVersion As String
|
|||
|
|
|
|||
|
|
''' <summary>更新服务版本</summary>
|
|||
|
|
Public Shared UsVersion As String
|
|||
|
|
|
|||
|
|
''' <summary>存入数据库日志类型</summary>
|
|||
|
|
Public Shared DbLogType As Byte
|
|||
|
|
|
|||
|
|
''' <summary>日志文件夹路径</summary>
|
|||
|
|
Public Shared Property LogDirPath As String
|
|||
|
|
Get
|
|||
|
|
Return UTS_Core.DebugLog.ApplicationLog.LogDirPath
|
|||
|
|
End Get
|
|||
|
|
Set(value As String)
|
|||
|
|
UTS_Core.DebugLog.ApplicationLog.LogDirPath = value
|
|||
|
|
End Set
|
|||
|
|
End Property
|
|||
|
|
|
|||
|
|
|
|||
|
|
''' <summary>日志文件前缀</summary>
|
|||
|
|
Public Shared Property LogFilePrefix As String
|
|||
|
|
Get
|
|||
|
|
Return UTS_Core.DebugLog.ApplicationLog.LogFilePrefix
|
|||
|
|
End Get
|
|||
|
|
Set(value As String)
|
|||
|
|
UTS_Core.DebugLog.ApplicationLog.LogFilePrefix = value
|
|||
|
|
End Set
|
|||
|
|
End Property
|
|||
|
|
|
|||
|
|
|
|||
|
|
Public Shared ReadOnly Property LogFilePath() As String
|
|||
|
|
Get
|
|||
|
|
Return UTS_Core.DebugLog.ApplicationLog.LogFilePath
|
|||
|
|
End Get
|
|||
|
|
End Property
|
|||
|
|
|
|||
|
|
|
|||
|
|
''' <summary>在线状态</summary>
|
|||
|
|
Public Shared Online As Boolean
|
|||
|
|
|
|||
|
|
''' <summary>将日志写入到本地文件</summary>
|
|||
|
|
Public Shared Sub WriteErrorLogToFile(logText As String)
|
|||
|
|
UTS_Core.DebugLog.ApplicationLog.WriteErrorLog(logText)
|
|||
|
|
End Sub
|
|||
|
|
|
|||
|
|
|
|||
|
|
''' <summary>
|
|||
|
|
''' 写入致命错误至本地与云端数据库
|
|||
|
|
''' </summary>
|
|||
|
|
''' <param name="logText">日志内容</param>
|
|||
|
|
Public Shared Sub WriteFatalLog(logText As String)
|
|||
|
|
WriteLogToLogQueue(UTS_Core.DebugLog.ApplicationLog.LogTypes.Fatal, logText)
|
|||
|
|
End Sub
|
|||
|
|
|
|||
|
|
|
|||
|
|
Public Shared Sub WriteErrorLog(logText As String)
|
|||
|
|
WriteLogToLogQueue(UTS_Core.DebugLog.ApplicationLog.LogTypes.Error, logText)
|
|||
|
|
End Sub
|
|||
|
|
|
|||
|
|
Public Shared Sub WriteWarningLog(logText As String)
|
|||
|
|
WriteLogToLogQueue(UTS_Core.DebugLog.ApplicationLog.LogTypes.Warn, logText)
|
|||
|
|
End Sub
|
|||
|
|
|
|||
|
|
Public Shared Sub WriteInfoLog(logText As String)
|
|||
|
|
WriteLogToLogQueue(UTS_Core.DebugLog.ApplicationLog.LogTypes.Info, logText)
|
|||
|
|
End Sub
|
|||
|
|
|
|||
|
|
Public Shared Sub WriteDebugLog(logText As String)
|
|||
|
|
WriteLogToLogQueue(UTS_Core.DebugLog.ApplicationLog.LogTypes.Debug, logText)
|
|||
|
|
End Sub
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
''' <summary>
|
|||
|
|
''' 添加日志内容至缓存的日志队列中
|
|||
|
|
''' 调用SaveLogQueueToDb将队列中的数据写入到数据库
|
|||
|
|
'''
|
|||
|
|
''' Tip:缓存队列仅记录每条日志不同的内容,例如写入时间,日志类型,日志内容等
|
|||
|
|
''' </summary>
|
|||
|
|
''' <param name="logType"></param>
|
|||
|
|
''' <param name="logText"></param>
|
|||
|
|
Public Shared Sub WriteLogToLogQueue(logType As UTS_Core.DebugLog.ApplicationLog.LogTypes, logText As String)
|
|||
|
|
UTS_Core.DebugLog.ApplicationLog.WriteLog($"{logType}", logText) '写入本地文本日志
|
|||
|
|
If ((DbLogType >> logType) And 1) = 0 Then Return '过滤不入库的信息
|
|||
|
|
|
|||
|
|
Dim dicFiled As New Dictionary(Of String, String)
|
|||
|
|
|
|||
|
|
dicFiled.Add($"{DataServiceLogTable.ColNames.DateTime}", $"{Now:yyyy-MM-dd HH:mm:ss}")
|
|||
|
|
|
|||
|
|
dicFiled.Add($"{DataServiceLogTable.ColNames.LogType}", $"{logType}")
|
|||
|
|
dicFiled.Add($"{DataServiceLogTable.ColNames.LogText}", $"{logText.Replace("'"c, """"c).Replace("`", """"c)}")
|
|||
|
|
|
|||
|
|
SyncLock LogLock
|
|||
|
|
LogQueue.Add(dicFiled) '将日志信息放入缓冲队列
|
|||
|
|
End SyncLock
|
|||
|
|
End Sub
|
|||
|
|
|
|||
|
|
Private Shared Sub SaveLogToLocalDb(count As Integer, Optional saveCache As Boolean = False)
|
|||
|
|
Dim tableName As String = DataServiceLogTable.TableName
|
|||
|
|
Using db As New DbExecutor(UtsDb.LocalDbType, UtsDb.LocalConnString)
|
|||
|
|
db.Open()
|
|||
|
|
|
|||
|
|
db.BeginTransaction()
|
|||
|
|
|
|||
|
|
Dim dicFiled As Dictionary(Of String, String)
|
|||
|
|
Dim cmdText As String
|
|||
|
|
Dim cmdHelper As DbCmdHelper = DbCmdHelper.CreateCmdHelper(UtsDb.RemoteDbType)
|
|||
|
|
|
|||
|
|
SyncLock LogLock
|
|||
|
|
For i As Integer = 0 To count - 1
|
|||
|
|
dicFiled = LogQueue.Item(i)
|
|||
|
|
|
|||
|
|
'修改上传方式为插值方式
|
|||
|
|
Dim colName As String
|
|||
|
|
Dim colNames As New List(Of String)
|
|||
|
|
Dim remoteFileds As New Dictionary(Of String, String)
|
|||
|
|
Try
|
|||
|
|
colName = $"{DataServiceLogTable.ColNames.ServiceID}"
|
|||
|
|
colNames.Add(colName)
|
|||
|
|
db.AddDbParameter(DbType.Int32, colName, DsIndex)
|
|||
|
|
remoteFileds.Add(colName, DsIndex.ToString)
|
|||
|
|
|
|||
|
|
colName = $"{DataServiceLogTable.ColNames.ServiceVersion}"
|
|||
|
|
colNames.Add(colName)
|
|||
|
|
db.AddDbParameter(DbType.AnsiString, colName, DsVersion)
|
|||
|
|
remoteFileds.Add(colName, DsVersion)
|
|||
|
|
|
|||
|
|
colName = $"{DataServiceLogTable.ColNames.UpdateServiceVersion}"
|
|||
|
|
colNames.Add(colName)
|
|||
|
|
db.AddDbParameter(DbType.AnsiString, colName, UsVersion)
|
|||
|
|
remoteFileds.Add(colName, UsVersion)
|
|||
|
|
|
|||
|
|
colName = $"{DataServiceLogTable.ColNames.VendorName}"
|
|||
|
|
colNames.Add(colName)
|
|||
|
|
db.AddDbParameter(DbType.AnsiString, colName, VendorName)
|
|||
|
|
remoteFileds.Add(colName, VendorName)
|
|||
|
|
|
|||
|
|
colName = $"{DataServiceLogTable.ColNames.DateTime}"
|
|||
|
|
colNames.Add(colName)
|
|||
|
|
db.AddDbParameter(DbType.DateTime, colName, dicFiled(colName))
|
|||
|
|
remoteFileds.Add(colName, dicFiled(colName))
|
|||
|
|
|
|||
|
|
colName = $"{DataServiceLogTable.ColNames.PublicIp}"
|
|||
|
|
colNames.Add(colName)
|
|||
|
|
db.AddDbParameter(DbType.AnsiString, colName, PublicIp)
|
|||
|
|
remoteFileds.Add(colName, PublicIp)
|
|||
|
|
|
|||
|
|
colName = $"{DataServiceLogTable.ColNames.PrivateIp}"
|
|||
|
|
colNames.Add(colName)
|
|||
|
|
db.AddDbParameter(DbType.AnsiString, colName, PrivateIp)
|
|||
|
|
remoteFileds.Add(colName, PrivateIp)
|
|||
|
|
|
|||
|
|
colName = $"{DataServiceLogTable.ColNames.LogType}"
|
|||
|
|
colNames.Add(colName)
|
|||
|
|
db.AddDbParameter(DbType.AnsiString, colName, dicFiled(colName))
|
|||
|
|
remoteFileds.Add(colName, dicFiled(colName))
|
|||
|
|
|
|||
|
|
colName = $"{DataServiceLogTable.ColNames.LogText}"
|
|||
|
|
colNames.Add(colName)
|
|||
|
|
db.AddDbParameter(DbType.AnsiString, colName, dicFiled(colName))
|
|||
|
|
remoteFileds.Add(colName, dicFiled(colName).Replace("'", " ").Replace("’", " "))
|
|||
|
|
|
|||
|
|
cmdText = db.CmdHelper.InsertParam(tableName, colNames)
|
|||
|
|
|
|||
|
|
db.ExecuteNonQuery(cmdText) '执行语句
|
|||
|
|
Catch ex As Exception
|
|||
|
|
WriteErrorLogToFile($"Write LogQueue To Local DB Error: {ex.Message}")
|
|||
|
|
Continue For
|
|||
|
|
End Try
|
|||
|
|
|
|||
|
|
|
|||
|
|
If saveCache Then
|
|||
|
|
Try
|
|||
|
|
cmdText = cmdHelper.DbInsert(UtsDb.RemotePublicDb, tableName, remoteFileds)
|
|||
|
|
DbConnector.SaveCmdStringToCacheTable(db, cmdText) '执行命令入缓存库
|
|||
|
|
Catch ex As Exception
|
|||
|
|
WriteErrorLogToFile($"Write LogQueue To Chche DB Error: {ex.Message}")
|
|||
|
|
Continue For
|
|||
|
|
End Try
|
|||
|
|
End If
|
|||
|
|
Next
|
|||
|
|
End SyncLock
|
|||
|
|
|
|||
|
|
db.CommitTransaction()
|
|||
|
|
db.Close()
|
|||
|
|
End Using
|
|||
|
|
End Sub
|
|||
|
|
|
|||
|
|
Private Shared Function SaveLogToRemoteDb(count As Integer) As Boolean
|
|||
|
|
Dim tableName As String = DataServiceLogTable.TableName
|
|||
|
|
Using db As New DbExecutor(UtsDb.RemoteDbType, UtsDb.RemoteConnString)
|
|||
|
|
db.Open()
|
|||
|
|
|
|||
|
|
db.BeginTransaction()
|
|||
|
|
|
|||
|
|
Dim dicFiled As Dictionary(Of String, String)
|
|||
|
|
Dim cmdText As String
|
|||
|
|
Dim colName As String
|
|||
|
|
Dim colNames As New List(Of String)
|
|||
|
|
|
|||
|
|
For i As Integer = 0 To count - 1
|
|||
|
|
colNames.Clear()
|
|||
|
|
dicFiled = LogQueue.Item(i)
|
|||
|
|
|
|||
|
|
Try
|
|||
|
|
colName = $"{DataServiceLogTable.ColNames.ServiceID}"
|
|||
|
|
colNames.Add(colName)
|
|||
|
|
db.AddDbParameter(DbType.Int32, colName, DsIndex)
|
|||
|
|
|
|||
|
|
colName = $"{DataServiceLogTable.ColNames.ServiceVersion}"
|
|||
|
|
colNames.Add(colName)
|
|||
|
|
db.AddDbParameter(DbType.AnsiString, colName, DsVersion)
|
|||
|
|
|
|||
|
|
colName = $"{DataServiceLogTable.ColNames.UpdateServiceVersion}"
|
|||
|
|
colNames.Add(colName)
|
|||
|
|
db.AddDbParameter(DbType.AnsiString, colName, UsVersion)
|
|||
|
|
|
|||
|
|
colName = $"{DataServiceLogTable.ColNames.VendorName}"
|
|||
|
|
colNames.Add(colName)
|
|||
|
|
db.AddDbParameter(DbType.AnsiString, colName, VendorName)
|
|||
|
|
|
|||
|
|
colName = $"{DataServiceLogTable.ColNames.DateTime}"
|
|||
|
|
colNames.Add(colName)
|
|||
|
|
db.AddDbParameter(DbType.DateTime, colName, dicFiled(colName))
|
|||
|
|
|
|||
|
|
colName = $"{DataServiceLogTable.ColNames.PublicIp}"
|
|||
|
|
colNames.Add(colName)
|
|||
|
|
db.AddDbParameter(DbType.AnsiString, colName, PublicIp)
|
|||
|
|
|
|||
|
|
colName = $"{DataServiceLogTable.ColNames.PrivateIp}"
|
|||
|
|
colNames.Add(colName)
|
|||
|
|
db.AddDbParameter(DbType.AnsiString, colName, PrivateIp)
|
|||
|
|
|
|||
|
|
colName = $"{DataServiceLogTable.ColNames.Mac}"
|
|||
|
|
colNames.Add(colName)
|
|||
|
|
db.AddDbParameter(DbType.AnsiString, colName, MAC)
|
|||
|
|
|
|||
|
|
colName = $"{DataServiceLogTable.ColNames.LogType}"
|
|||
|
|
colNames.Add(colName)
|
|||
|
|
db.AddDbParameter(DbType.AnsiString, colName, dicFiled(colName))
|
|||
|
|
|
|||
|
|
colName = $"{DataServiceLogTable.ColNames.LogText}"
|
|||
|
|
colNames.Add(colName)
|
|||
|
|
db.AddDbParameter(DbType.AnsiString, colName, dicFiled(colName))
|
|||
|
|
|
|||
|
|
cmdText = db.CmdHelper.DbInsertParam(UtsDb.RemotePublicDb, tableName, colNames)
|
|||
|
|
|
|||
|
|
db.ExecuteNonQuery(cmdText) '执行语句
|
|||
|
|
|
|||
|
|
db.ClearDbParameter()
|
|||
|
|
Catch ex As Exception
|
|||
|
|
WriteErrorLogToFile($"[{i}]Write LogQueue To Remote DB Error: {ex.Message}")
|
|||
|
|
|
|||
|
|
Try
|
|||
|
|
db.RollbackTransaction()
|
|||
|
|
db.Close()
|
|||
|
|
Catch ex2 As Exception
|
|||
|
|
WriteErrorLogToFile($"Write LogQueue To Remote DB Rollback Transaction Error: {ex.Message}")
|
|||
|
|
End Try
|
|||
|
|
|
|||
|
|
Return False
|
|||
|
|
End Try
|
|||
|
|
Next
|
|||
|
|
|
|||
|
|
db.CommitTransaction()
|
|||
|
|
db.Close()
|
|||
|
|
End Using
|
|||
|
|
|
|||
|
|
Return True
|
|||
|
|
End Function
|
|||
|
|
|
|||
|
|
|
|||
|
|
Public Shared Sub SaveLogQueueToDb()
|
|||
|
|
If LogQueue.Count <= 0 Then Return
|
|||
|
|
|
|||
|
|
Dim count As Integer = LogQueue.Count
|
|||
|
|
Dim saveCache As Boolean
|
|||
|
|
SyncLock LogLock
|
|||
|
|
'执行
|
|||
|
|
saveCache = SaveLogToRemoteDb(count) = False
|
|||
|
|
SaveLogToLocalDb(count, saveCache)
|
|||
|
|
|
|||
|
|
'删除
|
|||
|
|
For i As Integer = 0 To count - 1
|
|||
|
|
LogQueue.RemoveAt(0)
|
|||
|
|
Next
|
|||
|
|
End SyncLock
|
|||
|
|
End Sub
|
|||
|
|
|
|||
|
|
''' <summary>
|
|||
|
|
''' 创建数据服务日志表,数据服务独有
|
|||
|
|
''' </summary>
|
|||
|
|
Public Shared Sub CreateServiceLogTable()
|
|||
|
|
|
|||
|
|
Using db As New DbExecutor(UtsDb.LocalDbType, UtsDb.LocalConnString)
|
|||
|
|
db.Open()
|
|||
|
|
|
|||
|
|
Dim cmdText As String = DataServiceLogTable.CreateTableString("", DbExecutor.DbTypeEnum.Sqlite)
|
|||
|
|
|
|||
|
|
db.ExecuteNonQuery(cmdText)
|
|||
|
|
|
|||
|
|
db.Close()
|
|||
|
|
End Using
|
|||
|
|
|
|||
|
|
End Sub
|
|||
|
|
|
|||
|
|
End Class
|