diff --git a/lib/http/client.dart b/lib/http/client.dart index 75ac69d..c4daa58 100644 --- a/lib/http/client.dart +++ b/lib/http/client.dart @@ -15,33 +15,17 @@ class SubtracksHttpClient extends BaseClient { @override Future send(BaseRequest request) { request.headers.addAll(subtracksHeaders); - log.info('${request.method} ${_redactUri(request.url)}'); + log.info('${request.method} ${request.url}'); try { return request.send(); } catch (e, st) { - log.severe( - 'HTTP client: ${request.method} ${_redactUri(request.url)}', e, st); + log.severe('HTTP client: ${request.method} ${request.url}', e, st); rethrow; } } } -String _redactUri(Uri uri) { - var redacted = uri.toString(); - redacted = _redactParam(redacted, 'u'); - redacted = _redactParam(redacted, 'p'); - redacted = _redactParam(redacted, 's'); - redacted = _redactParam(redacted, 't'); - - return redacted.toString(); -} - -RegExp _queryReplace(String key) => RegExp('$key=([^&|\\n|\\t\\s]+)'); - -String _redactParam(String url, String key) => - url.replaceFirst(_queryReplace(key), '$key=REDACTED'); - @Riverpod(keepAlive: true) BaseClient httpClient(HttpClientRef ref) { return SubtracksHttpClient(); diff --git a/lib/log.dart b/lib/log.dart index a438576..db6f3c2 100644 --- a/lib/log.dart +++ b/lib/log.dart @@ -88,6 +88,7 @@ String _format( bool color = false, bool time = true, bool level = true, + bool redact = true, }) { var message = ''; if (time) message += '${event.time.toIso8601String()} '; @@ -107,6 +108,11 @@ String _format( if (event.error != null) { message += '\n${event.error}'; } + + if (redact) { + message = _redactUrl(message); + } + if (event.stackTrace != null) { message += '\n${event.stackTrace}'; } @@ -116,17 +122,24 @@ String _format( : message; } -Future _printFile(String event, String dir) async { - final now = DateTime.now(); - final file = File(p.join(dir, '${now.year}-${now.month}-${now.day}.txt')); - - if (!event.endsWith('\n')) { - event += '\n'; +String _redactUrl(String message) { + if (!_queryReplace('u').hasMatch(message)) { + return message; } - await file.writeAsString(event, mode: FileMode.writeOnlyAppend, flush: true); + message = _redactParam(message, 'u'); + message = _redactParam(message, 'p'); + message = _redactParam(message, 's'); + message = _redactParam(message, 't'); + + return message; } +RegExp _queryReplace(String key) => RegExp('$key=([^&|\\n|\\t\\s]+)'); + +String _redactParam(String url, String key) => + url.replaceAll(_queryReplace(key), '$key=REDACTED'); + Future logDirectory() async { return Directory( p.join((await getApplicationDocumentsDirectory()).path, 'logs'), @@ -141,11 +154,43 @@ Future> logFiles() async { ); } +File _currentLogFile(String logDir) { + final now = DateTime.now(); + return File(p.join(logDir, '${now.year}-${now.month}-${now.day}.txt')); +} + +Future _printFile(String event, String logDir) async { + final file = _currentLogFile(logDir); + + if (!event.endsWith('\n')) { + event += '\n'; + } + + await file.writeAsString(event, mode: FileMode.writeOnlyAppend, flush: true); +} + +void _printDebug(LogRecord event) { + // ignore: avoid_print + print(_format(event, color: true, time: false, level: false, redact: false)); +} + +Future _printRelease(LogRecord event, String logDir) async { + await _printFile( + _format(event, color: false, time: true, level: true, redact: true), + logDir, + ); +} + final log = Logger('default'); Future initLogging() async { final dir = (await logDirectory())..create(); + final file = _currentLogFile(dir.path); + if (!(await file.exists())) { + await file.create(); + } + final files = await logFiles(); if (files.length > 7) { for (var file in files.slice(7)) { @@ -156,14 +201,9 @@ Future initLogging() async { Logger.root.level = kDebugMode ? Level.ALL : Level.INFO; Logger.root.onRecord.asyncMap((event) async { if (kDebugMode) { - print(_format(event, color: true, time: false, level: false)); + _printDebug(event); } else { - await _printFile( - _format(event, color: false, time: true, level: true), - dir.path, - ); + await _printRelease(event, dir.path); } }).listen((_) {}, cancelOnError: false); - - log.info('start'); }