Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(api-logger): implement user info logger #3

Open
wants to merge 2 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions lib/fa_dart_logger.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,5 @@ library fa_dart_logger;

export 'src/app_log_impl.dart';
export 'src/base/app_log.dart';
export 'src/logger/helper/log_helper.dart';
export 'src/logger/model/index.dart';
34 changes: 34 additions & 0 deletions lib/src/app_log_impl.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
import 'package:fa_dart_logger/src/logger/helper/log_helper.dart';
import 'package:logger/logger.dart';

import 'base/app_log.dart';
import 'logger/model/index.dart';
import 'logger/output/my_console_output.dart';
import 'logger/printer/my_pretty_printer.dart';

Expand All @@ -17,6 +19,13 @@ class AppLogImpl implements AppLog {
final String? packageName;
late Logger _logger;

UserInfo? _userInfo;

// ignore: avoid_setters_without_getters
set userInfo(UserInfo userInfo) {
_userInfo = userInfo;
}

@override
void d(object) {
_logger.d(object);
Expand Down Expand Up @@ -46,4 +55,29 @@ class AppLogImpl implements AppLog {
void wtf(object) {
_logger.wtf(object);
}

/// [userInfo] must be set, before calling this method
@override
void r(
LogInfo logInfo, {
Severity severity = Severity.high,
}) {
if (_userInfo == null) {
d("Initialise user info before calling this method");
return;
}

/// TODO(@singhtaranjeet): Will capture the priority from remote config
const remotePriority = Severity.high;

if (shouldCaptureLog(
remoteSeverity: remotePriority, logSeverity: severity)) {
// Log the data to API Logger
final logData =
ApiLogInfo.fromLogInfo(logInfo: logInfo, userInfo: _userInfo!);

/// TODO(@singhtaranjeet): call remote log api
_logger.i(logData);
}
}
}
10 changes: 10 additions & 0 deletions lib/src/base/app_log.dart
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
import 'package:fa_dart_logger/src/logger/helper/log_helper.dart';

import '../logger/model/index.dart';

/// [AppLog] is used to provide an abstract logger base for various
/// logging needs. Extend this class to create your own logging
/// class for every logging usage. You can replace [print] and use
Expand All @@ -24,4 +28,10 @@ abstract class AppLog {

/// For logging some Unusual Behaviour
void wtf(dynamic object);

///For logging events remotely
void r(
LogInfo logInfo, {
Severity severity = Severity.high,
});
}
47 changes: 47 additions & 0 deletions lib/src/logger/helper/log_helper.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
enum Severity {
/// High Priority logs are Most important logs like errors, exceptions
/// Agenda of high tag is to `capture less but capture rock solid information`
high,

/// Medium priority logs are all the things that are good to have like
/// warnings, api logs, and all sorts of things.
medium,

/// Low priority logs are everything
/// be it widget push, route information, snapshot of data.
/// Agenda of these logs are to
/// `Capture everything and make goldmine of data to resolve the issues`
low,
}

Severity getSeverity(String severity) {
switch (severity) {
case "high":
return Severity.high;
case "medium":
return Severity.medium;
case "low":
return Severity.low;
default:
return Severity.high;
}
}

/// It is used to determine whether to capture the log or not
bool shouldCaptureLog(
{required Severity remoteSeverity, required Severity logSeverity}) {
if (remoteSeverity == Severity.low) {
return true;
}

if (remoteSeverity == Severity.medium &&
(logSeverity == Severity.medium || logSeverity == Severity.high)) {
return true;
}

if (remoteSeverity == Severity.high && logSeverity == Severity.high) {
return true;
}

return false;
}
2 changes: 2 additions & 0 deletions lib/src/logger/model/index.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
export 'log_info.dart';
export 'user_info.dart';
105 changes: 105 additions & 0 deletions lib/src/logger/model/log_info.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
import 'package:fa_dart_logger/fa_dart_logger.dart';

/// Use this for logging remotely logger.r()
class LogInfo {
LogInfo({
this.endpoint,
this.method,
this.response,
this.request,
this.error,
this.stackTrace,
this.warning,
this.message,
String? severity,
}) : severity = severity ?? Severity.high.name.toLowerCase(),
date = DateTime.now().toIso8601String();

final String? endpoint;
final String? method;
final String? response;
final String? request;
final String? error;
final StackTrace? stackTrace;
final String? warning;
final String? message;
final String severity;
final String date;

@override
String toString() {
return """LogInfo{endpoint: $endpoint, method: $method, response: $response, request: $request, error: $error, stackTrace: $stackTrace, warning: $warning, message: $message}, severity: $severity date: $date""";
}
}

/// Use this for send log to remote logging server
class ApiLogInfo extends LogInfo {
ApiLogInfo({
required this.userInfo,
String? endpoint,
String? method,
String? response,
String? request,
String? error,
StackTrace? stackTrace,
String? warning,
String? message,
String? severity,
}) : userInfoBatch = userInfo.getUcid(),
super(
endpoint: endpoint,
method: method,
response: response,
request: request,
error: error,
stackTrace: stackTrace,
warning: warning,
message: message,
severity: severity,
);

factory ApiLogInfo.fromLogInfo({
required LogInfo logInfo,
required UserInfo userInfo,
}) {
return ApiLogInfo(
endpoint: logInfo.endpoint,
method: logInfo.method,
response: logInfo.response,
request: logInfo.request,
error: logInfo.error,
stackTrace: logInfo.stackTrace,
warning: logInfo.warning,
message: logInfo.message,
userInfo: userInfo,
);
}

final UserInfo userInfo;

/// This batch is just user info seperated by underscore for better searching
/// for example: userName_id_companyId
final String userInfoBatch;

@override
String toString() {
return """ApiLogInfo{endpoint: $endpoint, method: $method, response: $response, request: $request, error: $error, stackTrace: $stackTrace, warning: $warning, message: $message, userInfo: $userInfo} userInfoBatch: $userInfoBatch, severity: $severity date: $date""";
}

Map<String, dynamic> toJson() {
return {
"endpoint": endpoint,
"method": method,
"response": response,
"request": request,
"error": error,
"stackTrace": stackTrace.toString(),
"warning": warning,
"message": message,
"userInfo": userInfo.toJson(),
"userInfoBatch": userInfoBatch,
"severity": severity,
"date": date,
};
}
}
25 changes: 25 additions & 0 deletions lib/src/logger/model/user_info.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
class UserInfo {
UserInfo({
required this.name,
required this.id,
required this.companyId,
});

final String name;
final String id;
final String companyId;

@override
String toString() => 'UserInfo{name: $name, id: $id, companyId: $companyId}';

/// Short for user_id company_companyId
String getUcid() => "${id}_${companyId}_";

Map<String, dynamic> toJson() {
return {
"name": name,
"id": id,
"companyId": companyId,
};
}
}
3 changes: 1 addition & 2 deletions pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,5 @@ dependencies:

dev_dependencies:
pedantic: ^1.11.0

# For information on the generic Dart part of this file, see the
# following page: https://dart.dev/tools/pub/pubspec
# following page: https://dart.dev/tools/pub/pubspec