write log 추가
This commit is contained in:
parent
fb22b79ffe
commit
4c312a297e
9 changed files with 180 additions and 81 deletions
|
|
@ -1,34 +1,5 @@
|
|||
import 'package:dart_framework/core/isolate_manager.dart';
|
||||
import 'package:dart_framework/core/log.dart';
|
||||
|
||||
Future<void> 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');
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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<IsolateTemplate>((isoEvent, data) async {
|
||||
var initData = {"param0": "value0"};
|
||||
IsolateManager.create<IsolateTemplate>(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<int, Map<String, Function(Object?)>> _innerEventMap = {};
|
||||
|
||||
static void create<T extends IsolateBase>(
|
||||
Object? initData,
|
||||
Function(IsolateEvent, Object?) isolateEventListener,
|
||||
Function(IsoMessege) messageListener) async {
|
||||
to._create<T>(isolateEventListener, messageListener);
|
||||
to._create<T>(initData, isolateEventListener, messageListener);
|
||||
}
|
||||
|
||||
void _create<T extends IsolateBase>(
|
||||
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]!;
|
||||
|
|
|
|||
|
|
@ -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<LogItem> 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();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
7
lib/data/isolate_data.dart
Normal file
7
lib/data/isolate_data.dart
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
enum IsolateEvent { ready, exit }
|
||||
|
||||
class IsoMessege {
|
||||
late String type;
|
||||
late Object? message;
|
||||
IsoMessege(this.type, {this.message});
|
||||
}
|
||||
|
|
@ -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();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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<LogWriterIO>((event, data) {}, listener);
|
||||
int _id = 0;
|
||||
|
||||
void startLog(String path, Function(IsoMessege) listener) {
|
||||
IsolateManager.create<LogWriterIO>(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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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() {}
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@ String toPascal(String raw) {
|
|||
}
|
||||
|
||||
String getDates() {
|
||||
return '$getDate() $getTime()';
|
||||
return '${getDate()} ${getTime()}';
|
||||
}
|
||||
|
||||
String getDate() {
|
||||
|
|
|
|||
|
|
@ -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<String, List<String>?> envArguments(List<String> arguments) {
|
||||
var dic = <String, List<String>?>{};
|
||||
|
|
@ -120,6 +121,18 @@ Future<Uint8List?> 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;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue