write log 추가

This commit is contained in:
toki 2023-03-19 13:25:37 +09:00
parent fb22b79ffe
commit 4c312a297e
9 changed files with 180 additions and 81 deletions

View file

@ -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');
}

View file

@ -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]!;

View file

@ -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();
}
}

View file

@ -0,0 +1,7 @@
enum IsolateEvent { ready, exit }
class IsoMessege {
late String type;
late Object? message;
IsoMessege(this.type, {this.message});
}

View file

@ -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();
}

View file

@ -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);
}

View file

@ -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() {}

View file

@ -3,7 +3,7 @@ String toPascal(String raw) {
}
String getDates() {
return '$getDate() $getTime()';
return '${getDate()} ${getTime()}';
}
String getDate() {

View file

@ -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;
}