From 4c312a297e15f2d07f3141c39d84e3fb3abe9f28 Mon Sep 17 00:00:00 2001 From: toki Date: Sun, 19 Mar 2023 13:25:37 +0900 Subject: [PATCH] =?UTF-8?q?write=20log=20=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bin/main.dart | 29 ----------- lib/core/isolate_manager.dart | 34 ++++++------- lib/core/log.dart | 95 +++++++++++++++++++++++++++++++---- lib/data/isolate_data.dart | 7 +++ lib/io/log_writer_base.dart | 20 ++++---- lib/io/log_writer_io.dart | 49 ++++++++++++++---- lib/io/log_writer_web.dart | 8 ++- lib/utils/string_util.dart | 2 +- lib/utils/system_util.dart | 17 ++++++- 9 files changed, 180 insertions(+), 81 deletions(-) create mode 100644 lib/data/isolate_data.dart diff --git a/bin/main.dart b/bin/main.dart index abdf3a3..fccc63d 100644 --- a/bin/main.dart +++ b/bin/main.dart @@ -1,34 +1,5 @@ -import 'package:dart_framework/core/isolate_manager.dart'; import 'package:dart_framework/core/log.dart'; Future main() async { - log('test'); - log('test2'); - test(); } - -void test() async { - await Future.delayed(const Duration(seconds: 1)); - log('this is test1'); - log('this is test2'); - - await Future.delayed(const Duration(seconds: 2)); - log('this is test3'); - log('this is test4'); - log('this is test5'); - - await Future.delayed(const Duration(seconds: 2)); - log('this is test6'); - log('this is test7'); - - await Future.delayed(const Duration(seconds: 1)); - log('this is test8'); - log('this is test9'); - - await Future.delayed(const Duration(seconds: 3)); - log('this is test10'); - log('this is test11'); - log('this is test12'); - log('this is test13'); -} diff --git a/lib/core/isolate_manager.dart b/lib/core/isolate_manager.dart index c25fc39..0d290b2 100644 --- a/lib/core/isolate_manager.dart +++ b/lib/core/isolate_manager.dart @@ -2,9 +2,12 @@ import 'dart:mirrors'; import 'dart:isolate'; import 'dart:async'; +import 'package:dart_framework/data/isolate_data.dart'; + /// ********************** Test ************************* /// void test() { - IsolateManager.create((isoEvent, data) async { + var initData = {"param0": "value0"}; + IsolateManager.create(initData, (isoEvent, data) async { if (isoEvent == IsolateEvent.ready) { int id = data as int; IsolateManager.sendBroadcast(IsoMessege('test1')); @@ -23,8 +26,8 @@ void test() { class IsolateTemplate extends IsolateBase { @override - void onReady() async { - print('[IsolateTemplate] onReady'); + void onReady(Object? initData) async { + print('[IsolateTemplate] onReady - initData: $initData'); addEventListener('test1', onTest1Handler, executeOnce: true); addEventListener('test2', onTest2Handler); } @@ -39,14 +42,6 @@ class IsolateTemplate extends IsolateBase { } /// ********************** Define *********************** /// -enum IsolateEvent { ready, exit } - -class IsoMessege { - late String type; - late Object? message; - IsoMessege(this.type, {this.message}); -} - class _IsolateInnerEvent { static const String ready = '_IsolateInnerEvent.Ready'; static const String exit = '_IsolateInnerEvent.Exit'; @@ -55,7 +50,8 @@ class _IsolateInnerEvent { class _IsolateConstructData { late int id; late SendPort mainIsoSender; - _IsolateConstructData(this.id, this.mainIsoSender); + late Object? initData; + _IsolateConstructData(this.id, this.mainIsoSender, this.initData); } class IsolateManager { @@ -77,12 +73,14 @@ class IsolateManager { final Map> _innerEventMap = {}; static void create( + Object? initData, Function(IsolateEvent, Object?) isolateEventListener, Function(IsoMessege) messageListener) async { - to._create(isolateEventListener, messageListener); + to._create(initData, isolateEventListener, messageListener); } void _create( + Object? initData, Function(IsolateEvent, Object?) isolateEventListener, Function(IsoMessege) messageListener) async { final isoListener = ReceivePort(); @@ -93,8 +91,8 @@ class IsolateManager { inst.isoListener = message as SendPort; isolateEventListener(IsolateEvent.ready, id); }); - await Isolate.spawn( - inst.initialize, _IsolateConstructData(id, isoListener.sendPort)); + await Isolate.spawn(inst.initialize, + _IsolateConstructData(id, isoListener.sendPort, initData)); await for (IsoMessege message in isoListener) { if (message.type == _IsolateInnerEvent.exit) { isolateEventListener(IsolateEvent.exit, null); @@ -169,7 +167,7 @@ class IsolateBase { _mainIsoSender = initData.mainIsoSender; send(IsoMessege(_IsolateInnerEvent.ready, message: _mainIsoListener.sendPort)); - onReady(); + onReady(initData.initData); await for (IsoMessege message in _mainIsoListener) { if (message.type == _IsolateInnerEvent.exit) { send(IsoMessege(_IsolateInnerEvent.exit)); @@ -181,7 +179,7 @@ class IsolateBase { Isolate.exit(_mainIsoSender); } - void onReady() async {} + void onReady(Object? initData) async {} void send(IsoMessege message) { _mainIsoSender.send(message); @@ -206,7 +204,7 @@ class IsolateBase { } void addEventListener(String type, Function(Object?) listener, - {bool executeOnce = true}) { + {bool executeOnce = false}) { List<_IsolateEventListener> list; if (_eventMap.containsKey(type)) { list = _eventMap[type]!; diff --git a/lib/core/log.dart b/lib/core/log.dart index b184c43..ae998be 100644 --- a/lib/core/log.dart +++ b/lib/core/log.dart @@ -1,7 +1,45 @@ -import 'package:dart_framework/core/isolate_manager.dart'; +import 'dart:io'; + +import 'package:dart_framework/data/isolate_data.dart'; import 'package:dart_framework/io/log_writer_base.dart'; import 'package:dart_framework/utils/string_util.dart'; +import 'package:dart_framework/utils/system_util.dart'; +/// ********************** Test ************************* /// +void test() async { + log('test'); + log('test2'); + + await Future.delayed(const Duration(seconds: 1)); + log('this is test1'); + log('this is test2'); + + await Future.delayed(const Duration(seconds: 2)); + log('this is test3'); + log('this is test4'); + log('this is test5'); + + await Future.delayed(const Duration(seconds: 2)); + logClear(); + + await Future.delayed(const Duration(seconds: 2)); + log('this is test6'); + log('this is test7'); + + await Future.delayed(const Duration(seconds: 1)); + log('this is test8'); + log('this is test9'); + + await Future.delayed(const Duration(seconds: 3)); + log('this is test10'); + log('this is test11'); + log('this is test12'); + log('this is test13'); + + logEnd(); +} + +/// ********************** Define *********************** /// void log(String message) { _logSend(message, LogType.verbose); } @@ -19,6 +57,14 @@ void _logSend(String message, LogType type) { Log.to.append(item); } +void logClear() { + Log.to.clear(); +} + +void logEnd() { + Log.to.end(); +} + enum LogType { verbose, error, warning } class LogItem { @@ -36,30 +82,52 @@ class LogItem { } class Log { + static String? path; int index = 0; StringBuffer buffer = StringBuffer(); Log._privateConstructor() { - LogWriterBase.start(_onWriterEvent); + initializeLog(); } - static final Log _instance = Log._privateConstructor(); + static late Log _instance = Log._privateConstructor(); static Log get to => _instance; final List logs = []; Log() { - LogWriterBase.start(_onWriterEvent); + _instance = this; + initializeLog(); + } + + void initializeLog() { + if (path == null) { + path = getDataPath(); + if (path!.isNotEmpty) { + path = '$path/logs'; + var dir = Directory(path!); + dir.createSync(recursive: true); + } + } + if (path != null && path!.isNotEmpty) { + startLogWriter(path!, _onWriterEvent); + } } void _onWriterEvent(IsoMessege message) { if (message.type == 'request') { - if (index != logs.length) { - for (int i = logs.length - index - 1; i >= 0; --i) { - buffer.writeln(logs[i].toString()); - } - index = logs.length; - LogWriterBase.write(buffer.toString()); - buffer.clear(); + write(); + } else if (message.type == 'ready') { + log('Log path: ${message.message}'); + } + } + + void write() { + if (index != logs.length) { + for (int i = logs.length - index - 1; i >= 0; --i) { + buffer.writeln(logs[i].toString()); } + index = logs.length; + writeLogWriter(buffer.toString()); + buffer.clear(); } } @@ -72,4 +140,9 @@ class Log { index = 0; log('Log Restarted.'); } + + void end() { + write(); + endLogWriter(); + } } diff --git a/lib/data/isolate_data.dart b/lib/data/isolate_data.dart new file mode 100644 index 0000000..99d913c --- /dev/null +++ b/lib/data/isolate_data.dart @@ -0,0 +1,7 @@ +enum IsolateEvent { ready, exit } + +class IsoMessege { + late String type; + late Object? message; + IsoMessege(this.type, {this.message}); +} diff --git a/lib/io/log_writer_base.dart b/lib/io/log_writer_base.dart index 8725778..80089a4 100644 --- a/lib/io/log_writer_base.dart +++ b/lib/io/log_writer_base.dart @@ -1,13 +1,15 @@ -import 'package:dart_framework/core/isolate_manager.dart'; +import 'package:dart_framework/data/isolate_data.dart'; import 'package:dart_framework/io/log_writer_io.dart' if (dart.library.html) 'package:dart_framework/io/log_writer_web.dart'; -abstract class LogWriterBase extends IsolateBase { - static void start(Function(IsoMessege) listener) { - startLog(listener); - } - - static void write(String log) { - print(log); - } +void startLogWriter(String path, Function(IsoMessege) listener) { + startLog(path, listener); +} + +void writeLogWriter(String log) { + writeLog(log); +} + +void endLogWriter() { + endLog(); } diff --git a/lib/io/log_writer_io.dart b/lib/io/log_writer_io.dart index 6f6405d..24222e0 100644 --- a/lib/io/log_writer_io.dart +++ b/lib/io/log_writer_io.dart @@ -1,13 +1,27 @@ import 'dart:io'; -import 'package:dart_framework/core/isolate_manager.dart'; -import 'package:dart_framework/io/log_writer_base.dart'; -class LogWriterIO extends LogWriterBase { +import 'package:path/path.dart' as path; + +import 'package:dart_framework/core/isolate_manager.dart'; +import 'package:dart_framework/utils/string_util.dart'; +import 'package:dart_framework/data/isolate_data.dart'; + +class LogWriterIO extends IsolateBase { + late File _file; @override - void onReady() { - print('[LogWriterIO] onReady'); - addEventListener('write', write); - requester(); + void onReady(Object? initData) async { + if ((initData as String?) != null) { + var dir = Directory(initData as String); + if (dir.existsSync()) { + _file = File(path.normalize( + '${dir.path}/log_${getDates().replaceAll(' ', '_').replaceAll(':', '-')}.txt')); + await _file.create(); + print('[LogWriterIO] onReady - path: ${_file.path}'); + send(IsoMessege('ready', message: _file.path)); + addEventListener('write', write); + requester(); + } + } } void requester() async { @@ -18,10 +32,25 @@ class LogWriterIO extends LogWriterBase { } void write(Object? message) { - print('write'); + // print('write in file: $message'); + _file.writeAsStringSync(message as String, mode: FileMode.append); } } -void startLog(Function(IsoMessege) listener) { - IsolateManager.create((event, data) {}, listener); +int _id = 0; + +void startLog(String path, Function(IsoMessege) listener) { + IsolateManager.create(path, (event, data) { + if (event == IsolateEvent.ready) { + _id = data as int; + } + }, listener); +} + +void writeLog(String log) { + IsolateManager.send(_id, IsoMessege('write', message: log)); +} + +void endLog() { + IsolateManager.exit(_id); } diff --git a/lib/io/log_writer_web.dart b/lib/io/log_writer_web.dart index 7d64039..fadc93b 100644 --- a/lib/io/log_writer_web.dart +++ b/lib/io/log_writer_web.dart @@ -1 +1,7 @@ -void startLog() {} +import 'package:dart_framework/data/isolate_data.dart'; + +void startLog(String path, Function(IsoMessege) listener) {} + +void writeLog(String log) {} + +void endLog() {} diff --git a/lib/utils/string_util.dart b/lib/utils/string_util.dart index cbe9fb2..94acb96 100644 --- a/lib/utils/string_util.dart +++ b/lib/utils/string_util.dart @@ -3,7 +3,7 @@ String toPascal(String raw) { } String getDates() { - return '$getDate() $getTime()'; + return '${getDate()} ${getTime()}'; } String getDate() { diff --git a/lib/utils/system_util.dart b/lib/utils/system_util.dart index 9f6382e..881b7f5 100644 --- a/lib/utils/system_util.dart +++ b/lib/utils/system_util.dart @@ -5,6 +5,7 @@ import 'dart:typed_data'; import 'package:path/path.dart'; import 'package:yaml/yaml.dart'; +import 'package:path/path.dart' as path; Map?> envArguments(List arguments) { var dic = ?>{}; @@ -120,6 +121,18 @@ Future readFileByte(String filePath) async { } String getProjectName() { - var ext = extension(Platform.executable); - return basename(Platform.executable).replaceAll(ext, ''); + return path.basename(path.dirname( + path.dirname(Platform.script.toFilePath(windows: Platform.isWindows)))); +} + +String? getDataPath() { + String? path = getUserPath(); + if (Platform.isMacOS) { + path = '$path/Library/Application Support/${getProjectName()}'; + } else if (Platform.isLinux) { + path = '$path/.config/${getProjectName()}'; + } else if (Platform.isWindows) { + path = '$path/AppData/Local/${getProjectName()}'; + } + return path; }