344 lines
		
	
	
		
			7.6 KiB
		
	
	
	
		
			Markdown
		
	
	
	
			
		
		
	
	
			344 lines
		
	
	
		
			7.6 KiB
		
	
	
	
		
			Markdown
		
	
	
	
| # @coze-arch/logger
 | |
| 
 | |
| A comprehensive logging and error reporting library for the Coze architecture ecosystem, providing unified console logging, Slardar integration, React error boundaries, and performance tracing capabilities.
 | |
| 
 | |
| ## Features
 | |
| 
 | |
| - **Unified Logging Interface**: Centralized logging with support for multiple log levels (info, success, warning, error, fatal)
 | |
| - **Console & Remote Reporting**: Dual output support for both console debugging and remote telemetry
 | |
| - **Slardar Integration**: Built-in support for Slardar error tracking and event reporting
 | |
| - **React Error Boundaries**: Ready-to-use error boundary components with automatic error reporting
 | |
| - **Performance Tracing**: Duration tracking for multi-step operations and workflows
 | |
| - **Context-Aware Logging**: Namespace and scope-based log organization
 | |
| - **TypeScript Support**: Full TypeScript definitions and type safety
 | |
| - **Pending Queue System**: Queues logs when reporter is not initialized, executes when ready
 | |
| - **Console Control**: Configurable console output for different environments
 | |
| 
 | |
| ## Get Started
 | |
| 
 | |
| ### Installation
 | |
| 
 | |
| ```bash
 | |
| # Add to your Rush.js workspace
 | |
| rush add -p @coze-arch/logger --dev
 | |
| 
 | |
| # Update dependencies
 | |
| rush update
 | |
| ```
 | |
| 
 | |
| ### Basic Usage
 | |
| 
 | |
| #### Console Logging
 | |
| 
 | |
| ```typescript
 | |
| import { logger } from '@coze-arch/logger';
 | |
| 
 | |
| // Simple string messages
 | |
| logger.info('Operation completed successfully');
 | |
| logger.warning('This is a warning message');
 | |
| logger.error({ message: 'Something went wrong', error: new Error('Details') });
 | |
| 
 | |
| // With context and metadata
 | |
| logger.info({
 | |
|   message: 'User action completed',
 | |
|   namespace: 'user-management',
 | |
|   scope: 'profile-update',
 | |
|   meta: {
 | |
|     userId: '12345',
 | |
|     action: 'profile_update',
 | |
|     duration: 150
 | |
|   }
 | |
| });
 | |
| ```
 | |
| 
 | |
| #### Remote Reporting
 | |
| 
 | |
| ```typescript
 | |
| import { reporter } from '@coze-arch/logger';
 | |
| 
 | |
| // Initialize with Slardar instance
 | |
| const slardarInstance = getSlardarInstance();
 | |
| reporter.init(slardarInstance);
 | |
| 
 | |
| // Log custom events
 | |
| reporter.event({
 | |
|   eventName: 'user_action',
 | |
|   namespace: 'analytics',
 | |
|   meta: {
 | |
|     action: 'button_click',
 | |
|     component: 'header'
 | |
|   }
 | |
| });
 | |
| 
 | |
| // Report errors
 | |
| reporter.error({
 | |
|   message: 'API request failed',
 | |
|   error: new Error('Network timeout'),
 | |
|   namespace: 'api',
 | |
|   scope: 'user-service'
 | |
| });
 | |
| ```
 | |
| 
 | |
| ## API Reference
 | |
| 
 | |
| ### Logger
 | |
| 
 | |
| The main logger instance for console output and basic logging.
 | |
| 
 | |
| ```typescript
 | |
| import { logger, Logger } from '@coze-arch/logger';
 | |
| 
 | |
| // Create custom logger with preset context
 | |
| const apiLogger = logger.createLoggerWith({
 | |
|   ctx: {
 | |
|     namespace: 'api',
 | |
|     scope: 'user-service'
 | |
|   }
 | |
| });
 | |
| 
 | |
| // Available log levels
 | |
| logger.info(message | options);
 | |
| logger.success(message | options);
 | |
| logger.warning(message | options);
 | |
| logger.error(options); // requires error object
 | |
| logger.fatal(options); // requires error object
 | |
| 
 | |
| // Setup configuration
 | |
| logger.setup({ 'no-console': true }); // Disable console output
 | |
| ```
 | |
| 
 | |
| ### Reporter
 | |
| 
 | |
| Handles remote logging and event reporting with Slardar integration.
 | |
| 
 | |
| ```typescript
 | |
| import { reporter, Reporter } from '@coze-arch/logger';
 | |
| 
 | |
| // Initialize reporter
 | |
| reporter.init(slardarInstance);
 | |
| 
 | |
| // Create reporter with preset context
 | |
| const moduleReporter = reporter.createReporterWithPreset({
 | |
|   namespace: 'auth',
 | |
|   scope: 'login',
 | |
|   meta: { version: '1.0.0' }
 | |
| });
 | |
| 
 | |
| // Custom logs
 | |
| reporter.info({ message: 'Info log', meta: { key: 'value' } });
 | |
| reporter.warning({ message: 'Warning log' });
 | |
| reporter.error({ message: 'Error log', error: new Error() });
 | |
| 
 | |
| // Custom events
 | |
| reporter.event({ eventName: 'user_login' });
 | |
| reporter.successEvent({ eventName: 'operation_complete' });
 | |
| reporter.errorEvent({ eventName: 'login_failed', error: new Error() });
 | |
| ```
 | |
| 
 | |
| ### Performance Tracing
 | |
| 
 | |
| Track duration across multiple steps in a workflow.
 | |
| 
 | |
| ```typescript
 | |
| import { reporter } from '@coze-arch/logger';
 | |
| 
 | |
| // Create tracer for a specific event
 | |
| const { trace } = reporter.tracer({ eventName: 'api_request' });
 | |
| 
 | |
| // Track steps with automatic duration calculation
 | |
| trace('start');
 | |
| // ... some operation
 | |
| trace('validation_complete');
 | |
| // ... more operations
 | |
| trace('request_sent');
 | |
| // ... final operations
 | |
| trace('success', {
 | |
|   meta: { responseSize: 1024 }
 | |
| });
 | |
| 
 | |
| // Handle errors in tracing
 | |
| trace('error', {
 | |
|   error: new Error('Request failed'),
 | |
|   meta: { statusCode: 500 }
 | |
| });
 | |
| ```
 | |
| 
 | |
| ### Error Boundary
 | |
| 
 | |
| React component for catching and reporting JavaScript errors.
 | |
| 
 | |
| ```typescript
 | |
| import { ErrorBoundary } from '@coze-arch/logger';
 | |
| 
 | |
| function App() {
 | |
|   return (
 | |
|     <ErrorBoundary
 | |
|       errorBoundaryName="main-app"
 | |
|       FallbackComponent={ErrorFallback}
 | |
|       onError={(error, errorInfo) => {
 | |
|         console.log('Error caught:', error);
 | |
|       }}
 | |
|       onReset={() => {
 | |
|         // Reset app state
 | |
|       }}
 | |
|     >
 | |
|       <YourAppComponents />
 | |
|     </ErrorBoundary>
 | |
|   );
 | |
| }
 | |
| 
 | |
| function ErrorFallback({ error, resetErrorBoundary }) {
 | |
|   return (
 | |
|     <div>
 | |
|       <h2>Something went wrong:</h2>
 | |
|       <pre>{error.message}</pre>
 | |
|       <button onClick={resetErrorBoundary}>Try again</button>
 | |
|     </div>
 | |
|   );
 | |
| }
 | |
| ```
 | |
| 
 | |
| ### Error Boundary Hooks
 | |
| 
 | |
| ```typescript
 | |
| import { useErrorBoundary, useErrorHandler } from '@coze-arch/logger';
 | |
| 
 | |
| function ComponentWithErrorHandling() {
 | |
|   const { showBoundary } = useErrorBoundary();
 | |
|   const handleError = useErrorHandler();
 | |
|   
 | |
|   const handleAsyncOperation = async () => {
 | |
|     try {
 | |
|       await riskyOperation();
 | |
|     } catch (error) {
 | |
|       // Report to error boundary
 | |
|       showBoundary(error);
 | |
|       // Or handle manually
 | |
|       handleError(error);
 | |
|     }
 | |
|   };
 | |
| }
 | |
| ```
 | |
| 
 | |
| ### Logger Context
 | |
| 
 | |
| Provide logger instances through React context.
 | |
| 
 | |
| ```typescript
 | |
| import { LoggerContext, useLogger } from '@coze-arch/logger';
 | |
| 
 | |
| // Provider
 | |
| function App() {
 | |
|   const logger = new Logger({
 | |
|     ctx: { namespace: 'app' }
 | |
|   });
 | |
|   
 | |
|   return (
 | |
|     <LoggerContext.Provider value={logger}>
 | |
|       <YourComponents />
 | |
|     </LoggerContext.Provider>
 | |
|   );
 | |
| }
 | |
| 
 | |
| // Consumer
 | |
| function Component() {
 | |
|   const logger = useLogger();
 | |
|   
 | |
|   logger.info('Component mounted');
 | |
| }
 | |
| ```
 | |
| 
 | |
| ### Types and Interfaces
 | |
| 
 | |
| ```typescript
 | |
| import type {
 | |
|   LogLevel,
 | |
|   CommonLogOptions,
 | |
|   CustomLog,
 | |
|   CustomErrorLog,
 | |
|   CustomEvent,
 | |
|   ErrorEvent,
 | |
|   LoggerCommonProperties
 | |
| } from '@coze-arch/logger';
 | |
| 
 | |
| // Log levels
 | |
| enum LogLevel {
 | |
|   INFO = 'info',
 | |
|   SUCCESS = 'success',
 | |
|   WARNING = 'warning',
 | |
|   ERROR = 'error',
 | |
|   FATAL = 'fatal'
 | |
| }
 | |
| 
 | |
| // Common log options interface
 | |
| interface CommonLogOptions {
 | |
|   namespace?: string;
 | |
|   scope?: string;
 | |
|   level?: LogLevel;
 | |
|   action?: LogAction[];
 | |
|   message?: string;
 | |
|   eventName?: string;
 | |
|   meta?: Record<string, unknown>;
 | |
|   error?: Error;
 | |
| }
 | |
| ```
 | |
| 
 | |
| ## Development
 | |
| 
 | |
| ### Running Tests
 | |
| 
 | |
| ```bash
 | |
| # Run all tests
 | |
| rush test
 | |
| 
 | |
| # Run tests with coverage
 | |
| rush test:cov
 | |
| 
 | |
| # Run tests for this package only
 | |
| cd packages/arch/logger
 | |
| rushx test
 | |
| ```
 | |
| 
 | |
| ### Linting
 | |
| 
 | |
| ```bash
 | |
| # Lint the package
 | |
| rushx lint
 | |
| 
 | |
| # Auto-fix linting issues
 | |
| rushx lint --fix
 | |
| ```
 | |
| 
 | |
| ### Building
 | |
| 
 | |
| ```bash
 | |
| # Build the package
 | |
| rushx build
 | |
| 
 | |
| # Type checking
 | |
| rushx ts-check
 | |
| ```
 | |
| 
 | |
| ## Dependencies
 | |
| 
 | |
| ### Production Dependencies
 | |
| 
 | |
| - **@coze-studio/slardar-interface**: Slardar integration interface
 | |
| - **@coze-arch/bot-env**: Environment configuration utilities
 | |
| - **@coze-arch/bot-typings**: Shared type definitions
 | |
| - **lodash-es**: Utility functions library
 | |
| - **react**: React library for error boundary components
 | |
| - **react-error-boundary**: React error boundary utilities
 | |
| 
 | |
| ### Development Dependencies
 | |
| 
 | |
| - **@coze-arch/eslint-config**: Shared ESLint configuration
 | |
| - **@coze-arch/ts-config**: Shared TypeScript configuration
 | |
| - **@coze-arch/vitest-config**: Shared Vitest configuration
 | |
| - **@types/lodash-es**: TypeScript definitions for lodash-es
 | |
| - **@types/react**: TypeScript definitions for React
 | |
| - **vitest**: Testing framework
 | |
| 
 | |
| ## License
 | |
| 
 | |
| This package is part of the Coze architecture ecosystem and follows the project's licensing terms. |