이 글은 주로 메시지 건너뛰기, 서식 지정 등의 기본 내용을 포함하여 PHP Yii 프레임워크의 일반적인 로그 작업에 대한 요약을 소개합니다. 도움이 필요한 친구들이 참고할 수 있습니다.
Log
Yii는 고도로 맞춤화되고 확장성이 뛰어난 로깅 프레임워크를 제공합니다. 사용 시나리오에 따라 텍스트 파일, 데이터베이스 파일, 이메일 등 다양한 메시지를 쉽게 녹음, 필터링, 병합할 수 있습니다.
Yii의 로깅 프레임워크 사용에는 다음 단계가 포함됩니다.
로깅 방법 호출
기본 애플리케이션의 구성 파일(예: 기본 아래 web.php)에서 로그 필터링 및 내보내기 설정 구성
다양한 시나리오에서 필터링된 로그 정보를 확인하세요
로그 기록
로그를 기록하는 것은 단순히 다음 메소드를 호출하는 것입니다:
[[Yii::trace()] ]: 특정 코드 조각 실행. 주로 개발 환경에서 사용됩니다.
[[Yii::info()]]: 특정 위치에서 유용한 정보를 기록할 때 사용됩니다.
[[Yii::warning()]]: 예상치 못한 일이 발생했을 때 이 방법을 사용하세요.
[[Yii::error()]]: 즉시 해결해야 할 치명적인 문제가 발생할 경우 이 메소드를 호출하여 관련 정보를 기록합니다.
위 메소드들은 정보를 기록하는 수준과 유형이 다르지만 실제로는 동일한 메소드 함수($message, $category = 'application')를 호출합니다. 그 중 $message는 기록할 정보이고, $category는 로그의 카테고리를 나타낸다. 다음 코드는 기본 'application' 카테고리에 추적 유형 정보가 기록됨을 나타냅니다.
Yii::trace('start calculating average revenue');
팁: 기록된 $message는 간단한 문자열이거나 복잡한 배열 또는 객체일 수 있습니다. 다양한 시나리오의 로깅 책임에 따라 적절한 $message 유형을 선택해야 합니다. 기본적으로 기록하는 $message가 String이 아닌 경우, 로그를 내보낼 때 [[yiihelpersVarDumper::export()]] 메소드를 호출하여 문자열 형태의 메시지를 출력합니다.
로그 메시지를 더 효과적으로 구성, 관리 및 필터링하려면 일반적으로 각 로그 유형에 적절한 카테고리를 할당해야 합니다. 다양한 목적에 따라 다양한 카테고리의 로그 필터링을 용이하게 하기 위해 명확한 계층적 의미가 있는 카테고리를 선택할 수 있습니다. 간단하고 효과적인 이름 지정 방법은 PHP의 마법 상수 METHOD를 카테고리 이름으로 사용하는 것입니다. 이것이 Yii 프레임워크의 핵심 코드가 로깅을 수행할 때 수행하는 작업입니다. 예:
Yii::trace('start calculating average revenue', __METHOD__);
METHOD 상수가 나타날 때마다 이는 현재 메서드의 이름과 현재 메서드가 속한 클래스의 전체 접두사를 나타냅니다. 예를 들어, appcontrollersRevenueController 클래스의 계산 메소드에 위와 같은 코드 라인이 있다면, 이때의 METHOD는 'appcontrollersRevenueController::calculate'를 나타냅니다.
팁: 위에서 언급한 방법은 실제로 싱글톤 개체 [[yiilogLogger|logger 개체]]의 [[yiilogLogger::log()|log()]] 메서드를 간단히 사용한 것입니다. getLogger() 메소드를 사용하여 이 싱글톤 객체를 얻습니다. 충분한 로그 정보를 기록했거나 현재 애플리케이션이 종료되면 로그 객체는 [yiilogDispatcher|메시지 디스패처]] 메서드를 호출하여 기록된 로그 정보를 구성된 대상 위치에 씁니다.
로그 대상
로그 대상은 [[yiilogTarget]] 또는 해당 하위 클래스의 인스턴스입니다. 심각도 수준 및 분류를 기준으로 로그를 필터링한 다음 로그를 적절한 미디어로 내보냅니다. 예를 들어, [[yiilogDbTarget|데이터베이스 대상]] 개체는 필터링된 로그 정보를 해당 데이터베이스로 내보냅니다.
다음과 같이 애플리케이션 구성 파일의 로그 구성 요소에 여러 로그 대상을 등록할 수 있습니다.
return [ // the "log" component must be loaded during bootstrapping time 'bootstrap' => ['log'], 'components' => [ 'log' => [ 'targets' => [ [ 'class' => 'yii\log\DbTarget', 'levels' => ['error', 'warning'], ], [ 'class' => 'yii\log\EmailTarget', 'levels' => ['error'], 'categories' => ['yii\db\*'], 'message' => [ 'from' => ['log@example.com'], 'to' => ['admin@example.com', 'developer@example.com'], 'subject' => 'Database errors at example.com', ], ], ], ], ], ];
참고: 로그 정보가 해당 로그 대상에 배포될 수 있도록 로그 구성 요소는 부트스트랩에서 구성되어야 합니다.
위 코드에서는 [[yiilogDispatcher::targets]]에 두 개의 로그 대상이 등록되어 있습니다.
오류 및 경고 정보를 필터링하고 이 정보를 데이터베이스에 저장하는 첫 번째 방법입니다.
두 번째는 카테고리가 yiidb*로 시작하는 오류 메시지를 필터링하고 이 메시지를 이메일을 통해 admin@example.com 및developer@example.com으로 보냅니다.
Yii에는 다음과 같은 로그 대상이 내장되어 있으며 API를 참조할 수 있습니다. 문서 구성 및 사용 방법을 알아 보겠습니다.
[[yiilogDbTarget]]: 로그 정보를 데이터베이스에 저장합니다.
[[yiilogEmailTarget]]: 위의 예와 같이 지정된 메일함으로 로그 정보를 보냅니다.
[[yiilogFileTarget]]: 파일에 로그를 씁니다.
[[yiilogSyslogTarget]]: PHP의 syslog() 메서드를 호출하여 시스템 로그에 로그를 씁니다.
다음으로 공통 로그 대상의 기능을 살펴보겠습니다.
消息过滤
就每一种log target而言,你可以配置它的 [[yii\log\Target::levels|levels]] 和 [[yii\log\Target::categories|categories]]属性类设置它的严重程度以及归属的分类。
[[yii\log\Target::levels|levels]]属性的采用一个数组里面的一个或者多个值,这个数组包含如下值:
error:对应[[Yii::error()]]记录的消息
warning:对应[[Yii::warning()]]记录的消息
info :对应 [[Yii::info()]]记录的信息
trace:对应 [[Yii::trace()]]记录的信息.
profile :对应[[Yii::beginProfile()]] 和 [[Yii::endProfile()]]记录的信息,这种方式下面更多详细信息会被记录。
如果你没有指定[[yii\log\Target::levels|levels]] 的值,那么任何level的信息都会被记录。
[[yii\log\Target::categories|categories]] 属性的值是数组,这个数组里面的值可以是一个具体的分类名称,也可以是类似正则的匹配模式。只有在target能在这个数组里面找到对应的分类名或者符合某一个匹配模式,他才会处理这些消息。这里的匹配模式的组成是在分类的名称后面加上一个号。如果这个分类恰好和这个匹配模式的号前的字符匹配,那么也就是这个分类找到对应匹配值。举个例来说,在类[[yii\db\Command]]中的yii\db\Command::execute和yii \db\Command:: query 方法使用类名类记录相关日志信息,那么这个时候他们都匹配模式yii\db*
同样的,如果我们没有指定[[yii\log\Target::categories|categories]],那么每一种分类的日志信息都会被处理。
除了通过[[yii\log\Target::categories|categories]] 属性来设置分类的白名单外,你也可以通过 [[yii\log\Target::except|except]]属性来设置分类的黑名单。属于黑名单的分类日志信息不会被target处理。
下面的配置指定了一个分类匹配yii\db*或者 yii\web\HttpException:*,但又不包括yii\web\HttpException:404的分类,而且它只处理错误和警告的日志信息。
[ 'class' => 'yii\log\FileTarget', 'levels' => ['error', 'warning'], 'categories' => [ 'yii\db\*', 'yii\web\HttpException:*', ], 'except' => [ 'yii\web\HttpException:404', ], ]
注意:当错误的句柄捕获到HTTP的异常的时候,记录的日志信息会以yii\web\HttpException:ErrorCode的这种格式
记录,例如[[yii\web\NotFoundHttpException]] 就会被记录成yii\web\HttpException:404
消息格式化
日志targets用多种格式来导出日志。举个例子,如果你的日志target是[[yii\log\FileTarget]],那么你在你的程序中记录日志的时候,应该会找到类似于文件runtime/log/app.log 记录的如下的信息:
2014-10-04 18:10:15 [::1][][-][trace][yii\base\Module::getModule] Loading module: debug
默认情况下,[[yii\log\Target::formatMessage()]]:会帮我们把日志信息格式化成下面的这种格式:
Timestamp [IP address][User ID][Session ID][Severity Level][Category] Message Text
你可以通过给[[yii\log\Target::prefix]] 属性配置一个自定义的回调函数来 自定义日志的前缀。下面的代码就实现了在每条日志信息前面加上了用户的ID(ip地址,sessionId等敏感信息因为个人隐私被去掉了)。
[ 'class' => 'yii\log\FileTarget', 'prefix' => function ($message) { $user = Yii::$app->has('user', true) ? Yii::$app->get('user') : null; $userID = $user ? $user->getId(false) : '-'; return "[$userID]"; } ]
除了日志消息的前缀,日志的target还把一些上下文信息附加在了每一批的日志记录中。默认情况下,全局的PHP变量包含$_GET, $_POST, $_FILES, $_COOKIE, $_SESSION 和 $_SERVER. 你可以通过配置 [[yii\log\Target::logVars]] 来调整日志记录的全局变量。下面的代码表示的是只记录$_SERVER相关的变量。
[ 'class' => 'yii\log\FileTarget', 'logVars' => ['_SERVER'], ]
当 'logVars'为空的时候,表示不记录相关的上下文信息。如果你想自定义上下文信息的提供方式,你可以覆写[[yii\log\Target::getContextMessage()]] 方法。
消息的trace等级
在开发的过程当中,我们总是期望能够知道每一条日志消息是来自哪里。在Yii中你可以通过配置[[yii\log\Dispatcher::traceLevel|traceLevel]] 属性来实现。配置的示例如下:
return [ 'bootstrap' => ['log'], 'components' => [ 'log' => [ 'traceLevel' => YII_DEBUG ? 3 : 0, 'targets' => [...], ], ], ];
上面的示例在YII_DEBUG为true的时候将[[yii\log\Dispatcher::traceLevel|traceLevel]] 设置为3,反之设置为0. 意思是什么呢?3表示每一条日志记录都会记录与之相关的三层栈调用信息,0表示不记录任何相关的栈调用信息
提示:没有必要总是记录调用的堆栈信息,比较耗性能。所以,你应该只在你开发的时候或者用于调试的情况下使用该功能。
消息的清空和导出
就如同上面说的,记录的消息以数组的形式保存在[[yii\log\Logger|logger object]]中。为了限制这个数组消耗过多的内存,当这个数组包含的内容大小达到某个量的时候会被对应的target从内存中转移到对应的目标(文件,数据库...)中。你可以通过设置 [[yii\log\Dispatcher::flushInterval|flushInterval]] 的值来决定量的大小。像下面这样:
return [ 'bootstrap' => ['log'], 'components' => [ 'log' => [ 'flushInterval' => 100, // default is 1000 'targets' => [...], ], ], ];
注意:在应用运行结束的时候也会刷新内存,这样做事为了让日志的target能够记录完整的信息。
把日志信息从内存刷到对应存放的地方的这一动作不是立即发生的。事实上,和上面一样,都是当内存中的日志大小达到一定程度才会发生。你可以像下面的示例一样通过配置不同target的[[yii\log\Target::exportInterval|exportInterval]]值,来达到修改的目的:
[ 'class' => 'yii\log\FileTarget', 'exportInterval' => 100, // default is 1000 ]
因为清空和导出的设定,默认情况下你调用 Yii::trace() 或者其他的日志记录方法的时候不会在日志target下立马看到日志消息。这对某些长时间运行的控制台程序是一个问题。不过这个问题是可以解决的,方法入下面的代码,你需要把[[yii\log\Dispatcher::flushInterval|flushInterval]] 和[[yii\log\Target::exportInterval|exportInterval]] 的值都设置成1:
return [ 'bootstrap' => ['log'], 'components' => [ 'log' => [ 'flushInterval' => 1, 'targets' => [ [ 'class' => 'yii\log\FileTarget', 'exportInterval' => 1, ], ], ], ], ];
注意:如此频繁的清空和导出日志消息会降低系统的性能。
切换日志的targets
你可以通过设置[[yii\log\Target::enabled|enabled]] 属性来禁止日志的target。就如同下面的代码描述的一样:
Yii::$app->log->targets['file']->enabled = false;
上面的代码需要你在配置文件里面有一个下面的配置:
return [ 'bootstrap' => ['log'], 'components' => [ 'log' => [ 'targets' => [ 'file' => [ 'class' => 'yii\log\FileTarget', ], 'db' => [ 'class' => 'yii\log\DbTarget', ], ], ], ], ];
创建一个新的target
首先,创建一个新的日志target是很简单的。你主要做的事情是实现[[yii\log\Target::export()]] 方法并且把数组类型的消息[[yii\log\Target::messages]]发送到指定的存储媒介上去就行了。在这个过程中你可以调用[[yii\log\Target::formatMessage()]] 方法来格式化每一条日志消息。至于更多的细节你可以在Yiid的发行版本里找到详细的信息。
性能评测
性能评测是一种比较特别的日志记录。它通常用来获取某些模块执行时间的数据,以此来找到性能的问题所在。比如说,[[yii\db\Command]] 这个类就用性能评测日志来获得每一条sql查询所花费的时间。
要使用该类日志,你首先要做的时确定你要测试的代码范围。然后在每一段代码之间你都应该要保持它们是闭合的,就像下面这个样子:
\Yii::beginProfile('myBenchmark'); ...code block being profiled... \Yii::endProfile('myBenchmark');
myBenchmark只是一个标识,用于你在查看对应日志记录的时候快速定位。
在beginProfile和endProfile之间是可以再嵌套的,但是必须保证正确的闭合关系,如下所示:
\Yii::beginProfile('block1'); // some code to be profiled \Yii::beginProfile('block2'); // some other code to be profiled \Yii::endProfile('block2'); \Yii::endProfile('block1');
如果上面的闭合关系出错了,对应的记录都不会正常工作。
对于每一块被评测的代码,日志的level都是profile。你可以再日志的target中配置这些信息并导出它们。 Yii内建了 Yii debugger来展示评测的结果。
以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!
相关推荐:
위 내용은 PHP에서 Yii 프레임워크의 일반적인 로그 작업의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!