Files
AUTS_Desktop_Prod/AUTS_DataService/ServiceLog.vb

335 lines
12 KiB
VB.net
Raw Normal View History

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