public void Print(ELogLevel level, ELogTag tag, string format, params object[] args) { if (level < _logLevel) { return; } if (_logBitmap[(int)tag] == 0) { return; } string content = format; try { content = string.Format(format, args); } catch (Exception e) { content = e.ToString(); level = ELogLevel.Error; } { string sameStr = content.Substring(0, Mathf.Min(SUPPRESS_LOG_SAMPLE_CHAR_COUNT, content.Length)); if (string.IsNullOrEmpty(_sameLogStr) || !sameStr.Equals(_sameLogStr)) { _sameLogStr = sameStr; _sameLogCnt = 0; } else { _sameLogCnt++; } if (_sameLogCnt == SUPPRESS_LOG_MAX_LINE) { content = "<ignore duplicate log message>"; } else if (_sameLogCnt > SUPPRESS_LOG_MAX_LINE) { return; } } LogMessage msg = null; if (_logWriter != null) { msg = _logWriter.GetMessage(); } msg.time = DateTime.Now; msg.level = level; msg.tag = tag; msg.content = content; lock (_logStringBuilder) { if (level >= LogConstant.PRINT_STACK_LEVEL) { // All print call contains 2 frame which in this file. StackTrace stackTrace = new StackTrace(2, true); StackFrame[] stackFrames = stackTrace.GetFrames(); msg.stack = stackFrames; GetStackStr(_logStringBuilder, msg.stack); msg.stackStr = _logStringBuilder.ToString(); } PackMessage(msg, _logStringBuilder); } // Output Log to file if (_logWriter != null) { _logWriter.AddMessage(msg); } if (level >= _logLevelConsole) { // Output Log console. PrintMessage(msg); } }