-
Notifications
You must be signed in to change notification settings - Fork 17.5k
[AIRFLOW-1385] Make Airflow task logging configurable #2464
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
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,13 @@ | ||
| # -*- coding: utf-8 -*- | ||
| # | ||
| # Licensed under the Apache License, Version 2.0 (the "License"); | ||
| # you may not use this file except in compliance with the License. | ||
| # You may obtain a copy of the License at | ||
| # | ||
| # http://www.apache.org/licenses/LICENSE-2.0 | ||
| # | ||
| # Unless required by applicable law or agreed to in writing, software | ||
| # distributed under the License is distributed on an "AS IS" BASIS, | ||
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| # See the License for the specific language governing permissions and | ||
| # limitations under the License. |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -122,6 +122,13 @@ security = | |
| # values at runtime) | ||
| unit_test_mode = False | ||
|
|
||
| # User defined logging configuration file path. | ||
| logging_config_path = | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Why no time pull this from the logging config, can be global (in the dict) but seems to be tight to a Handler
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Oh this specifies the filename of the user defined logging configuration if they do not want to use the default
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Gotcha |
||
|
|
||
| # Name of handler to read task instance logs. | ||
| # Default to use file task handler. | ||
| task_log_reader = file.task | ||
|
|
||
| [cli] | ||
| # In what way should the cli access the API. The LocalClient will use the | ||
| # database directly, while the json_client will use the api running on the | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,94 @@ | ||
| # -*- coding: utf-8 -*- | ||
| # | ||
| # Licensed under the Apache License, Version 2.0 (the "License"); | ||
| # you may not use this file except in compliance with the License. | ||
| # You may obtain a copy of the License at | ||
| # | ||
| # http://www.apache.org/licenses/LICENSE-2.0 | ||
| # | ||
| # Unless required by applicable law or agreed to in writing, software | ||
| # distributed under the License is distributed on an "AS IS" BASIS, | ||
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| # See the License for the specific language governing permissions and | ||
| # limitations under the License. | ||
|
|
||
| import os | ||
|
|
||
| from airflow import configuration as conf | ||
|
|
||
| # TODO: Logging format and level should be configured | ||
| # in this file instead of from airflow.cfg. Currently | ||
| # there are other log format and level configurations in | ||
| # settings.py and cli.py. Please see AIRFLOW-1455. | ||
|
|
||
| LOG_LEVEL = conf.get('core', 'LOGGING_LEVEL').upper() | ||
| LOG_FORMAT = conf.get('core', 'log_format') | ||
|
|
||
| BASE_LOG_FOLDER = conf.get('core', 'BASE_LOG_FOLDER') | ||
|
|
||
| # TODO: REMOTE_BASE_LOG_FOLDER should be deprecated and | ||
| # directly specify in the handler definitions. This is to | ||
| # provide compatibility to older remote log folder settings. | ||
| REMOTE_BASE_LOG_FOLDER = conf.get('core', 'REMOTE_BASE_LOG_FOLDER') | ||
| S3_LOG_FOLDER = '' | ||
| GCS_LOG_FOLDER = '' | ||
| if REMOTE_BASE_LOG_FOLDER.startswith('s3:/'): | ||
| S3_LOG_FOLDER = REMOTE_BASE_LOG_FOLDER | ||
| elif REMOTE_BASE_LOG_FOLDER.startswith('gs:/'): | ||
| GCS_LOG_FOLDER = REMOTE_BASE_LOG_FOLDER | ||
|
|
||
| FILENAME_TEMPLATE = '{dag_id}/{task_id}/{execution_date}/{try_number}.log' | ||
|
|
||
| DEFAULT_LOGGING_CONFIG = { | ||
| 'version': 1, | ||
| 'disable_existing_loggers': False, | ||
| 'formatters': { | ||
| 'airflow.task': { | ||
| 'format': LOG_FORMAT, | ||
| }, | ||
| }, | ||
| 'handlers': { | ||
| 'console': { | ||
| 'class': 'logging.StreamHandler', | ||
| 'formatter': 'airflow.task', | ||
| 'stream': 'ext://sys.stdout' | ||
| }, | ||
| 'file.task': { | ||
| 'class': 'airflow.utils.log.file_task_handler.FileTaskHandler', | ||
| 'formatter': 'airflow.task', | ||
| 'base_log_folder': os.path.expanduser(BASE_LOG_FOLDER), | ||
| 'filename_template': FILENAME_TEMPLATE, | ||
| }, | ||
| 's3.task': { | ||
| 'class': 'airflow.utils.log.s3_task_handler.S3TaskHandler', | ||
| 'formatter': 'airflow.task', | ||
| 'base_log_folder': os.path.expanduser(BASE_LOG_FOLDER), | ||
| 's3_log_folder': S3_LOG_FOLDER, | ||
| 'filename_template': FILENAME_TEMPLATE, | ||
| }, | ||
| 'gcs.task': { | ||
| 'class': 'airflow.utils.log.gcs_task_handler.GCSTaskHandler', | ||
| 'formatter': 'airflow.task', | ||
| 'base_log_folder': os.path.expanduser(BASE_LOG_FOLDER), | ||
| 'gcs_log_folder': GCS_LOG_FOLDER, | ||
| 'filename_template': FILENAME_TEMPLATE, | ||
| }, | ||
| }, | ||
| 'loggers': { | ||
| 'airflow.task': { | ||
| 'handlers': ['file.task'], | ||
| 'level': LOG_LEVEL, | ||
| 'propagate': False, | ||
| }, | ||
| 'airflow.task_runner': { | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Why is this not a child of airflow.task? It would not require to repeat the same config
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @bolkedebruin Task runner in current structure is under module Airflow not airflow.task. It uses a LoggingMixin that gets the corresponding logger with the module name. We can make another folder called under airflow/task and put task runner inside if needed. But we can always reorganize the folder structure later.
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Ok. Leave it for now then |
||
| 'handlers': ['file.task'], | ||
| 'level': LOG_LEVEL, | ||
| 'propagate': True, | ||
| }, | ||
| 'airflow.task.raw': { | ||
| 'handlers': ['console'], | ||
| 'level': LOG_LEVEL, | ||
| 'propagate': False, | ||
| }, | ||
| } | ||
| } | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,13 @@ | ||
| # -*- coding: utf-8 -*- | ||
| # | ||
| # Licensed under the Apache License, Version 2.0 (the "License"); | ||
| # you may not use this file except in compliance with the License. | ||
| # You may obtain a copy of the License at | ||
| # | ||
| # http://www.apache.org/licenses/LICENSE-2.0 | ||
| # | ||
| # Unless required by applicable law or agreed to in writing, software | ||
| # distributed under the License is distributed on an "AS IS" BASIS, | ||
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| # See the License for the specific language governing permissions and | ||
| # limitations under the License. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Let's use hasattr instead
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It's more explicit
Uh oh!
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
https://hynek.me/articles/hasattr This article points out using
hasattrin Python 2 can be harmful since it shadows errors in properties. In this case it's probably fine for now to usehasattrbut it doesn't seem to be a good practice to use in Python 2.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Nice catch. Feel free to leave as is