1
0
forked from baron/baron-sso

make dev/dev-debug 구분.

This commit is contained in:
2026-05-20 13:34:19 +09:00
parent 0155ee4ee7
commit 5496735e2f
15 changed files with 192 additions and 45 deletions

View File

@@ -29,23 +29,37 @@ class LogPolicy {
env == 'staging';
}
static bool parseBoolFlag(String? raw) {
static ({bool enabled, bool specified}) parseOptionalBoolFlag(String? raw) {
final value = (raw ?? '').trim().toLowerCase();
return value == '1' ||
if (value == '1' ||
value == 'true' ||
value == 'yes' ||
value == 'y' ||
value == 'on';
value == 'on') {
return (enabled: true, specified: true);
}
if (value == '0' ||
value == 'false' ||
value == 'no' ||
value == 'n' ||
value == 'off') {
return (enabled: false, specified: true);
}
return (enabled: false, specified: false);
}
static bool debugEnabled({
required String? appEnv,
required String? productionDebugFlag,
}) {
final flag = parseOptionalBoolFlag(productionDebugFlag);
if (flag.specified) {
return flag.enabled;
}
if (!isProductionEnv(appEnv)) {
return true;
}
return parseBoolFlag(productionDebugFlag);
return false;
}
static bool shouldRelayClientLog({

View File

@@ -1,10 +1,10 @@
import 'dart:convert';
import 'package:flutter/foundation.dart';
import 'package:flutter_dotenv/flutter_dotenv.dart';
import 'package:logging/logging.dart' as std_log;
import 'package:logger/logger.dart' as pretty_log;
import 'auth_proxy_service.dart';
import 'log_policy.dart';
import 'runtime_env.dart';
/// Global Logger Service for Baron SSO Frontend
class LoggerService {
@@ -16,10 +16,10 @@ class LoggerService {
late final String _productionDebugFlag;
LoggerService._internal() {
_appEnv = _envOrDefault('APP_ENV', 'dev');
_productionDebugFlag = _envOrDefault(
_appEnv = envOrDefault('APP_ENV', 'dev');
_productionDebugFlag = envOrDefault(
'CLIENT_LOG_DEBUG',
_envOrDefault('USERFRONT_DEBUG_LOG', ''),
envOrDefault('USERFRONT_DEBUG_LOG', ''),
);
final debugEnabled = LogPolicy.debugEnabled(
appEnv: _appEnv,
@@ -54,17 +54,6 @@ class LoggerService {
});
}
static String _envOrDefault(String key, String fallback) {
if (!dotenv.isInitialized) {
return fallback;
}
final value = dotenv.env[key];
if (value == null || value.trim().isEmpty) {
return fallback;
}
return value;
}
/// Initialize the logger. Call this in main.dart
static void init() {
// Accessing the instance triggers the constructor

View File

@@ -1,5 +1,11 @@
import 'package:flutter_dotenv/flutter_dotenv.dart';
const _compileTimeEnv = {
'APP_ENV': String.fromEnvironment('APP_ENV'),
'CLIENT_LOG_DEBUG': String.fromEnvironment('CLIENT_LOG_DEBUG'),
'USERFRONT_DEBUG_LOG': String.fromEnvironment('USERFRONT_DEBUG_LOG'),
};
String runtimeOriginFallback() {
try {
final origin = Uri.base.origin;
@@ -11,14 +17,18 @@ String runtimeOriginFallback() {
}
String envOrDefault(String key, String fallback) {
if (!dotenv.isInitialized) {
return fallback;
if (dotenv.isInitialized) {
final value = dotenv.env[key];
if (value != null && value.trim().isNotEmpty) {
return value;
}
}
final value = dotenv.env[key];
if (value == null || value.trim().isEmpty) {
return fallback;
final compileTimeValue = _compileTimeEnv[key];
if (compileTimeValue != null && compileTimeValue.trim().isNotEmpty) {
return compileTimeValue;
}
return value;
return fallback;
}
String sanitizedUrl(String value) {

View File

@@ -5,10 +5,14 @@ cd /workspace
/bin/sh ./scripts/sync_userfront_locales.sh
cd /workspace/userfront
exec flutter run \
set -- flutter run \
-d web-server \
--web-hostname 0.0.0.0 \
--web-port "${USERFRONT_INTERNAL_PORT:-5000}" \
--wasm \
--debug \
--dart-define=CLIENT_LOG_DEBUG="${CLIENT_LOG_DEBUG:-false}" \
--dart-define=APP_ENV="${APP_ENV:-dev}" \
${USERFRONT_FLUTTER_RUN_FLAGS:-} \
--no-web-resources-cdn
exec "$@"

View File

@@ -9,14 +9,30 @@ void main() {
isTrue,
);
expect(
LogPolicy.debugEnabled(
appEnv: 'development',
productionDebugFlag: 'false',
),
LogPolicy.debugEnabled(appEnv: 'development', productionDebugFlag: ''),
isTrue,
);
});
test('explicit debug flag applies in development-like environment', () {
expect(
LogPolicy.debugEnabled(appEnv: 'dev', productionDebugFlag: 'true'),
isTrue,
);
expect(
LogPolicy.debugEnabled(appEnv: 'development', productionDebugFlag: '1'),
isTrue,
);
expect(
LogPolicy.debugEnabled(appEnv: 'dev', productionDebugFlag: 'false'),
isFalse,
);
expect(
LogPolicy.debugEnabled(appEnv: 'development', productionDebugFlag: '0'),
isFalse,
);
});
test('production disables debug unless explicitly enabled', () {
expect(
LogPolicy.debugEnabled(appEnv: 'production', productionDebugFlag: ''),
@@ -94,6 +110,28 @@ void main() {
isTrue,
);
});
test(
'explicit development debug false forwards only warning or higher',
() {
expect(
LogPolicy.shouldRelayClientLog(
level: 'INFO',
appEnv: 'dev',
productionDebugFlag: 'false',
),
isFalse,
);
expect(
LogPolicy.shouldRelayClientLog(
level: 'WARN',
appEnv: 'dev',
productionDebugFlag: 'false',
),
isTrue,
);
},
);
});
group('LogPolicy.sanitize', () {