@@ -77,6 +77,7 @@ public final class NKLogFileManager {
7777 public var logLevel : NKLogLevel
7878 private var currentLogDate : String
7979 private let logQueue = DispatchQueue ( label: " LogWriterQueue " , attributes: . concurrent)
80+ private let rotationQueue = DispatchQueue ( label: " LogRotationQueue " )
8081 private let fileManager = FileManager . default
8182
8283 // MARK: - Initialization
@@ -142,20 +143,37 @@ public final class NKLogFileManager {
142143 writeLog ( " \( emojiColored) [ \( tag. uppercased ( ) ) ] \( message) " )
143144 }
144145
146+ /// Writes a log message to both the console and the log file.
147+ /// Emojis and keyword replacements (e.g. [SUCCESS] -> 🟢) are only applied to the console output.
148+ /// The log file is plain and suitable for parsing. Rotation is handled before writing.
149+ ///
150+ /// - Parameter message: The log message to record.
145151 public func writeLog( _ message: String ? ) {
146152 guard logLevel != . disabled, let message = message else { return }
147153
154+ // Generate timestamps for file and console
148155 let fileTimestamp = Self . stableTimestampString ( )
149156 let consoleTimestamp = Self . localizedTimestampString ( )
150- let line = " [ \( consoleTimestamp) ] \( message) "
157+
158+ // Prepare the clean file line (without emojis or replacements)
151159 let fileLine = " \( fileTimestamp) \( message) \n "
152160
153- let emoji = emojiColored ( message)
154- let consoleLine = " \( emoji) \( line) "
161+ // Prepare the console line with emoji prefix and keyword substitution
162+ let emojiPrefix = emojiColored ( message)
163+ let visualMessage = message
164+ . replacingOccurrences ( of: " [SUCCESS] " , with: " 🟢 " )
165+ . replacingOccurrences ( of: " [ERROR] " , with: " 🔴 " )
166+
167+ let consoleLine = " [NKLOG] [ \( consoleTimestamp) ] \( emojiPrefix) \( visualMessage) "
155168 print ( consoleLine)
156169
157- logQueue. async {
170+ // Ensure log rotation is completed before writing to the file
171+ rotationQueue. sync {
158172 self . checkForRotation ( )
173+ }
174+
175+ // Write to the log file asynchronously
176+ logQueue. async {
159177 self . appendToLog ( fileLine)
160178 }
161179 }
0 commit comments