Commit Graph

143 Commits

Author SHA1 Message Date
c892df89ab Sanitize docker labels when used as journald field names
This fix tries to address the issue raised in #23528 where
docker labels caused journald log error because journald
has special requirements on field names.

This fix addresses this issue by sanitize the labels per
requirements of journald.

Additional unit tests have been added to cover the changes.

This fix fixes #23528.

Signed-off-by: Yong Tang <yong.tang.github@outlook.com>
Upstream-commit: 9528ea930cdb90f906230a6d4cab179001255927
Component: engine
2016-08-05 15:20:47 -07:00
9b3fd45051 Merge pull request #22911 from vdemeester/20033-default-logging-tag-value
Standardize default logging tag value
Upstream-commit: 48569e0a35934c566b60b99c5c40ac13df517cac
Component: engine
2016-07-29 02:18:57 +02:00
f3d95a7a8f Merge pull request #22982 from nalind/log-newlines
Improve logging of long log lines
Upstream-commit: e43033bc238ce61466c0abe3702878eeeba5e917
Component: engine
2016-07-28 16:41:01 -07:00
3fd6864743 daemon/logger: fix races in channel close
it's actually not okay to do such trick from multiple goroutines

Signed-off-by: Alexander Morozov <lk4d4@docker.com>
Upstream-commit: 378f0657f963fa6c854643571e4fe83628466c01
Component: engine
2016-06-27 14:14:23 -07:00
675aa5766a Fixing file handle leak for "docker logs"
If "docker logs" was used on an offline container, the logger is leaked, leaving it up to the finalizer to close the file handle, which could block removal of the container.  Further, the json file logger could leak an open handle if the logs are read without follow due to an early return without a close.  This change addresses both cases.

Signed-off-by: Stefan J. Wernli <swernli@microsoft.com>
Upstream-commit: 54f11b84d218c1a7ff4ab4e2148819265da213bc
Component: engine
2016-06-21 18:40:30 -07:00
fb7430591e Improve logging of long log lines
This change updates how we handle long lines of output from the
container.  The previous logic used a bufio reader to read entire lines
of output from the container through an intermediate BytesPipe, and that
allowed the container to cause dockerd to consume an unconstrained
amount of memory as it attempted to collect a whole line of output, by
outputting data without newlines.

To avoid that, we replace the bufio reader with our own buffering scheme
that handles log lines up to 16k in length, breaking up anything longer
than that into multiple chunks.  If we can dispense with noting this
detail properly at the end of output, we can switch from using
ReadBytes() to using ReadLine() instead.  We add a field ("Partial") to
the log message structure to flag when we pass data to the log driver
that did not end with a newline.

The Line member of Message structures that we pass to log drivers is now
a slice into data which can be overwritten between calls to the log
driver's Log() method, so drivers which batch up Messages before
processing them need to take additional care: we add a function
(logger.CopyMessage()) that can be used to create a deep copy of a
Message structure, and modify the awslogs driver to use it.

We update the jsonfile log driver to append a "\n" to the data that it
logs to disk only when the Partial flag is false (it previously did so
unconditionally), to make its "logs" output correctly reproduce the data
as we received it.

Likewise, we modify the journald log driver to add a data field with
value CONTAINER_PARTIAL_MESSAGE=true to entries when the Partial flag is
true, and update its "logs" reader to refrain from appending a "\n" to
the data that it retrieves if it does not see this field/value pair (it
also previously did this unconditionally).

Signed-off-by: Nalin Dahyabhai <nalin@redhat.com> (github: nalind)
Upstream-commit: 513ec73831269947d38a644c278ce3cac36783b2
Component: engine
2016-06-14 14:11:47 -04:00
6942781ead Add a benchmark for logger.Copier
Add a benchmark for measuring how the logger.Copier implementation
handles logged lines of sizes ranging up from 64 bytes to 256KB.

Signed-off-by: Nalin Dahyabhai <nalin@redhat.com>
Upstream-commit: af439c7a8da878450d0e5583935a1c4208fa92ad
Component: engine
2016-06-09 09:47:13 -04:00
6075499108 Merge pull request #23063 from yongtang/22961-aws-sdk-go
Update aws-sdk-go to v1.1.30
Upstream-commit: 3f970819bb4231375f7821aa54670fd59e384f4d
Component: engine
2016-06-05 16:01:52 -04:00
bfa1e8baff Standardize default logging tag value
Use the same default tag value for all loggers that support tags.

Signed-off-by: Vincent Demeester <vincent@sbr.pm>
Upstream-commit: f900e1cf47f6a18eaa4ce438cc8fc0623f2eaec0
Component: engine
2016-06-04 12:38:12 +02:00
5578aba972 Merge pull request #23193 from allencloud/fix-typos
use grep to find all a/an typos
Upstream-commit: 98c245c9e63793cf8ca03c5500e0820447c1861c
Component: engine
2016-06-02 18:45:08 -07:00
04d8138246 Add support for reading journal extras and in UTC
When told to read additional attributes from logs that we've sent to the
journal, pull out all of the non-trusted, non-user fields that we didn't
hard-code ourselves.  More of PR#20726 and PR#21889.

When reading entries in the journald log reader, set the time zone on
timestamps that we read to UTC, so that we send UTC values to the client
instead of values that are local to whatever timezone dockerd happens to
be running in.

Signed-off-by: Nalin Dahyabhai <nalin@redhat.com> (github: nalind)
Upstream-commit: 0da0a8f9dae35e6a9cb63b9e4a3285e24c001af3
Component: engine
2016-06-02 10:17:07 -04:00
35c5774373 fix typos
Signed-off-by: allencloud <allen.sun@daocloud.io>
Upstream-commit: c1be45fa38e82054dcad606d71446a662524f2d5
Component: engine
2016-06-02 17:17:22 +08:00
0593e6d766 Fix the comment for daemon/logger.Copier
Now daemon/logger.Copier does not use ContainerID

Addendum to #23141

Signed-off-by: Akihiro Suda <suda.akihiro@lab.ntt.co.jp>
Upstream-commit: 518709a87e04f55babc5162861aa4ba9a423f0c8
Component: engine
2016-06-02 13:10:51 +09:00
dc1c41cd47 Remove the logger.Message ContainerID field
Log drivers are instantiated on a per-container basis, and passed the
container ID (along with other information) when they're initialized.
Drivers that care about that value are caching the value that they're
passed when they're initialized and using it in favor of the value
contained in Message structures that are passed to them, so the field in
Messages is unused, so we remove it.

Signed-off-by: Nalin Dahyabhai <nalin@redhat.com>
Upstream-commit: 7772d270c06cc6c26359b556c95563bae31c1038
Component: engine
2016-05-31 16:41:29 -04:00
801ed1028f Merge pull request #22384 from yongtang/22358-log-tag-prefix
Remove `docker/` prefix from log messages tag.
Upstream-commit: f3a7abee8107eb13e13dfff959998286b87a34ed
Component: engine
2016-05-30 14:48:31 +02:00
b039e514c3 Fix build errors caused by update aws-sdk-go to v1.1.30
This fix tries to fix build errors caused by updating
aws-sdk-go to v1.1.30.

This fix fixes #22961.

Signed-off-by: Yong Tang <yong.tang.github@outlook.com>
Upstream-commit: 46ea8ff75d03999e08f77f526e93d8489eb0fabd
Component: engine
2016-05-28 18:49:17 -07:00
8c21a32e0f awslogs: Fix a race in mockcwlogsclient
Signed-off-by: Samuel Karp <skarp@amazon.com>
Upstream-commit: c1ad02ccc8791b3c517aa37223d27792863cbf17
Component: engine
2016-05-25 11:50:22 -07:00
1c46623429 Fix a race in daemon/logger.TestCopier
Update #22963

Signed-off-by: Akihiro Suda <suda.akihiro@lab.ntt.co.jp>
Upstream-commit: ab533f06510a14a023c056604f9520741073acd3
Component: engine
2016-05-25 05:07:24 +00:00
f36200bd07 Remove docker/ prefix from log messages tag.
This fix tries to address the issue raised in #22358 where syslog's
message tag always starts with `docker/` and can not be removed
by changing the log tag templates.

The issue is that syslog driver hardcodes `path.Base(os.Args[0])`
as the prefix, which is the binary file name of the daemon (`dockerd`).
This could be an issue for certain situations (e.g., #22358) where
user may prefer not to have a dedicated prefix in syslog messages.
There is no way to override this behavior in the current verison of
the docker.

This fix tries to address this issue without making changes in the
default behavior of the syslog driver. An additional
`{{.DaemonName}}` has been introduced in the syslog tag. This is
assigned as the `docker` when daemon starts. The default log tag
template has also been changed from
`path.Base(os.Args[0]) + "/{{.ID}}"` to `{{.DaemonName}}/{{.ID}}`.
Therefore, there is no behavior changes when log-tag is not provided.

In order to be consistent, the default log tag for fluentd has been
changed from `docker.{{.ID}}` to `{{DaemonName}}.{{.ID}}` as well.

The documentation for log-tag has been updated to reflect this change.

Additional test cases have been added to cover changes in this fix.

This fix fixes #22358.

Signed-off-by: Yong Tang <yong.tang.github@outlook.com>
Upstream-commit: 38c49d99870c762a0ea23dadda414f9cc59071b6
Component: engine
2016-05-12 22:29:30 -07:00
979a878be3 Remove deprecated driver specific log tags
Since 1.9, driver specific log tag options
`syslog-tag`
`gelf-tag`
`fluentd-tag`
have been deprecated in favor of the generic tag
option which is standard across different logging
drivers.

This fix removed the deprecated driver specific
log tag options of `syslog-tag`, `gelf-tag`,
`fluentd-tag` for 1.12 and updated the docs.

Signed-off-by: Yong Tang <yong.tang.github@outlook.com>
Upstream-commit: a20b02b9158c283402d174926c84e657e53b17a1
Component: engine
2016-05-10 07:43:44 -07:00
697f71e4f2 Add support for reading logs extra attrs
The jsonlog logger currently allows specifying envs and labels that
should be propagated to the log message, however there has been no way
to read that back.

This adds a new API option to enable inserting these attrs back to the
log reader.

With timestamps, this looks like so:
```
92016-04-08T15:28:09.835913720Z foo=bar,hello=world hello
```

The extra attrs are comma separated before the log message but after
timestamps.

Without timestaps it looks like so:
```
foo=bar,hello=world hello
```

Signed-off-by: Brian Goff <cpuguy83@gmail.com>
Upstream-commit: bd9d14a07b9f1c82625dc8483245caf3fa7fe9e6
Component: engine
2016-05-06 20:42:20 -04:00
a97fd7f656 inherit the daemon log options when creating containers
Signed-off-by: Shijiang Wei <mountkin@gmail.com>
Upstream-commit: 1790980ec68c2579712e97ecffcdb8fa93700bc6
Component: engine
2016-05-02 23:04:04 +08:00
35425a4320 Merge pull request #21613 from wzyboy/support-unixgram-syslog-address
Support unixgram syslog address
Upstream-commit: dbee44c9e0d9f8afbbb86efd2c0bcbd66440cbbc
Component: engine
2016-04-28 11:06:17 -04:00
48a9de5e52 Support unixgram syslog address
- Consider unixgram:// as a valid URL prefix
- Parse unixgram:// addresses
- Update docs

Signed-off-by: Zhuoyun Wei <wzyboy@wzyboy.org>
Upstream-commit: 57fad95e4352c72c852d740e54fd693a446c552f
Component: engine
2016-04-28 11:04:50 +08:00
c931d8e5af enable syslog logger to have access to env and labels
Signed-off-by: Alan Scherger <flyinprogrammer@gmail.com>
Upstream-commit: f67b7112775fd9957cc156cc4483e11b8c0c981a
Component: engine
2016-04-08 19:50:18 -05:00
6e179f4b7d Additional syslog-format option to allow microsecond resolution in syslog timestamp.
This fix tries to add an additional syslog-format of `rfc5424micro` which follows
the same as rfc5424 except that it use microsecond resolution for timestamp. The
purpose is to solve the issue raised in #21793 where log events might lose its
ordering if happens on the same second.

The timestamp field in rfc5424 is derived from rfc3339, though the maximium
resolution is limited to "TIME-SECFRAC" which is 6 (microsecond resolution).

The appropriate documentation (`docs/admin/logging/overview.md`) has been updated
to reflect the change in this fix.

This fix adds a unit test to cover the newly introduced format.

This fix fixes #21793.

Signed-off-by: Yong Tang <yong.tang.github@outlook.com>
Upstream-commit: 7581cf96fbe0cddacf246f2982634190ebe455c9
Component: engine
2016-04-08 05:00:11 +00:00
b5af51fa11 daemon: remove some unused code
Signed-off-by: Alexander Morozov <lk4d4@docker.com>
Upstream-commit: b9966f3a81e89640d0de8fa5ae8d38213df0b8fe
Component: engine
2016-03-31 11:24:12 -07:00
dc335512b1 Merge pull request #21607 from allencloud/change-validateNoSchema-to-validateNoScheme
change validateNoSchema to validateNoScheme
Upstream-commit: e6f2429e017eb3c41bbc77442e81a23635287625
Component: engine
2016-03-31 10:14:23 +02:00
8ae6c0847a 1.change validateNoSchema into validateNoScheme
2.change schema into scheme in docs and some annotations.

Signed-off-by: allencloud <allen.sun@daocloud.io>
Upstream-commit: 28d3c22e55259281c70fd90780a1b0d388450ddf
Component: engine
2016-03-31 12:29:15 +08:00
b709f80542 Open the journald following descriptor earlier
Following a journal log almost always requires a descriptor to be
allocated.  In cases where we're running out of descriptors, this means
we might get stuck while attempting to start following the journal, at a
point where it's too late to report it to the client and clean up
easily.  The journal reading context will cache the value once it's
allocated, so here we move the check earlier, so that we can detect a
problem when we can still report it cleanly.

Signed-off-by: Nalin Dahyabhai <nalin@redhat.com>
Upstream-commit: ab62ecf393b92d1e644f82c4711b6618b7c572a5
Component: engine
2016-03-24 10:12:51 -04:00
a1d1c1292b Improve error reporting when following journals
When we set up to start following a journal, if we get error results
from sd_journal_get_fd() or sd_journal_get_events() that prevent us from
following the journal, report the error instead of just mysteriously
failing.

Signed-off-by: Nalin Dahyabhai <nalin@redhat.com> (github: nalind)
Upstream-commit: 8d597d25a86c608e2e1e4ef150d7e9eb68306bc0
Component: engine
2016-03-24 10:12:15 -04:00
a369a60b8b Merge pull request #21301 from cpuguy83/cleaner_file_log
Fixes some issues with jsonfile write/read
Upstream-commit: 11b4c89087cb7d6014e6106521ebb92fa74d01ab
Component: engine
2016-03-21 14:03:36 -07:00
d7a627364b Fixes some issues with jsonfile write/read
This cleans up some of the use of the filepoller which makes reading
significantly more robust and gives fewer changes to fallback to the
polling based watcher.
In a lot of cases, if the file was being rotated while we were adding it
to the watcher, it would return an error that the file doesn't exist and
would fallback.
In some cases this fallback could be triggered multiple times even if we
were already on the fallback/poll-based watcher.

It also fixes an open file leak caused by not closing files properly on
rotate, as well as not closing files that were read via the `tail`
function until after the log reader is completed.

Prior to the above changes, it was relatively simple to cause the log
reader to error out by having quick rotations, for example:
```
$ docker run --name test --log-opt max-size=10b --log-opt max-files=10
-d busybox sh -c 'while true; do usleep 500000; echo hello; done'
$ docker logs -f test
```
After these changes I can run this forever without error.

Another fix removes 2 `os.Stat` calls when rotating files. The stat
calls are not needed since we are just calling `os.Rename` anyway, which
will in turn also just produce the same error that `Stat` would.
These `Stat` calls were also quite expensive.
Removing these stat calls also seemed to resolve an issue causing slow
memory growth on the daemon.

Signed-off-by: Brian Goff <cpuguy83@gmail.com>
Upstream-commit: 1ae9dcf97dc6ccaf7a7977fe8ae1812b691ccba2
Component: engine
2016-03-21 11:05:58 -04:00
0f2d2de049 fluentd logger: support all options besides Unix sockets
Mostly useful for docker/docker#19438.

Signed-off-by: Pierre Carrier <pierre@meteor.com>
Upstream-commit: 13086f387b28ceea5aff5924e430f41608884a9b
Component: engine
2016-03-21 10:03:21 +00:00
35aa0cbae1 Revert "Added flag to ignore fluentd connect error on container start"
This reverts commit 3cf82ff1ab14e1ddd2b629524e894ac359168388.

Signed-off-by: Pierre Carrier <pierre@meteor.com>
Upstream-commit: d89dae6e4becc16e80e3781ac68b9fbb855947b3
Component: engine
2016-03-20 16:22:19 +00:00
a49b1e8f69 Fix a race in cleaning up after journald followers
When following a journal-based log, it was possible for the worker
goroutine, which reads the journal using the journal context and sends
entry data down the message channel, to be scheduled after the function
which started it had returned.  This could create problems, since the
invoking function was closing the journal context object and message
channel before it returned, which could trigger use-after-free segfaults
and write-to-closed-channel panics in the worker goroutine.

Make the cleanup in the invoking function conditional so that it's only
done when we're not following the logs, and if we are, that it's left to
the worker goroutine to close them.

Signed-off-by: Nalin Dahyabhai <nalin@redhat.com> (github: nalind)
Upstream-commit: 52c0f36f7b7aa794932fa41dfe50dc85f78e6146
Component: engine
2016-03-17 18:36:21 -04:00
ecc2f43e0e Fix a race in maintaining the journald reader list
The journald log reader keeps a map of following readers so that it can
close them properly when the journald reader object itself is closed,
but it was possible for its worker goroutine to be scheduled so that the
worker attempted to remove a reader from the map before the reader had
been added to the map.  This patch adds the item to the map before
starting the goroutine which is expected to eventually remove it.

Signed-off-by: Nalin Dahyabhai <nalin@redhat.com> (github: nalind)
Upstream-commit: 4d200cd6938c1416e34bf43576b0d528b73e8ba3
Component: engine
2016-03-17 18:36:21 -04:00
a0ed1e9e01 Merge pull request #21293 from cpuguy83/wtf_gcp
Do not call out to Google on init
Upstream-commit: 2b9ceea896ae0b0d1cf8c1a02b32a88861601b7e
Component: engine
2016-03-17 10:32:21 -07:00
d72402c2b3 Merge pull request #21273 from jfrazelle/remove-dead-code
remove dead code
Upstream-commit: 04c7d94c710bdb6c8378bdf896fd67455ba23199
Component: engine
2016-03-17 09:16:02 -07:00
0fc82d9270 Do not call out to Google on init
The GCP logging driver is calling out to GCP cloud service on package
init.
This is regardless if you are using GCP logging or not.

This change makes this happen on the first invocation of a new GCP
logging driver instance instead.

Signed-off-by: Brian Goff <cpuguy83@gmail.com>
Upstream-commit: 24710fd3e228398dc02c72ab3f0efe70d70c313e
Component: engine
2016-03-17 11:06:21 -04:00
8366a6bcc0 remove dead code
Signed-off-by: Jessica Frazelle <acidburn@docker.com>
Upstream-commit: 8dd88afb5b5f8ce353c00bfc71edf8238f3a0452
Component: engine
2016-03-16 19:15:14 -07:00
195d725261 *: fix response body leaks
Signed-off-by: Antonio Murdaca <runcom@redhat.com>
Upstream-commit: f0d83c4cdb49adb53fdaf4216a4395c23d5cc8e9
Component: engine
2016-03-16 17:15:42 +01:00
a516bc2aa3 Merge pull request #19831 from cloudflare/optimize-gelf
GELF logger: Add gelf-compression-type and gelf-compression-level
Upstream-commit: 0f59b0b12c37b5a3b4ad1c8a0cb91c93ff4228a9
Component: engine
2016-03-15 22:35:46 +01:00
9b54541f07 add gelf option to customize compression type and level
this allows user to choose the compression type (i.e. gzip/zlib/none) using
--log-opt=gelf-compression-type=none or the compression level (-1..9) using
--log-opt=gelf-compression-level=0 for gelf driver.

Signed-off-by: Daniel Dao <dqminh@cloudflare.com>
Upstream-commit: bd94baa353498df2457b3d5aa192cc488b9fa0c6
Component: engine
2016-03-15 11:06:06 +00:00
971cc9c13a Merge pull request #20121 from solganik/master
syslog format
Upstream-commit: f5009515989f6e16d3e9955a7905d1fe64e73642
Component: engine
2016-03-14 20:09:15 -04:00
a66058a138 Provide basic string manupilation functions for template executions.
This change centralizes the template manipulation in a single package
and adds basic string functions to their execution.

Signed-off-by: David Calavera <david.calavera@gmail.com>
Upstream-commit: 8514880997bd1bc944769dcc41e52307bb01f7ff
Component: engine
2016-03-09 19:37:12 -05:00
0df74af651 Fixes #18712. Add rfc5424 log format for syslog.
Previously docker used obsolete rfc3164 syslog format for syslog. rfc3164 explicitly
uses semicolon as a separator between 'TAG' and 'Content' section of the log message.
Docker uses semicolon as a separator between image name and version tag.
When {{.ImageName}} was used as a tag expression and contained ":" syslog parser mistreated
"tag" part of the image name as syslog message body, which resulted in incorrect "syslogtag" been reported by syslog
daemon.
Use of rfc5424 log format partually fixes the issue as it does not use semicolon as a separator.
However using default rfc5424 syslog format itroduces backward incompatability because rsyslog template keyword  %syslogtag%
is parsed differently. In rfc3164 it uses the "TAG" part reported before the "pid" part. In rfc5424 it uses "appname" part reported
before the pid part, while tag part is introduced by %msgid% part.
For more information on rsyslog configuration properties see: http://www.rsyslog.com/doc/master/configuration/properties.html

Added two options to specify logging in either rfc5424, rfc3164 format or unix format omitting hostname in order to keep backwards compatability with
previous versions.

Signed-off-by: Solganik Alexander <solganik@gmail.com>
Upstream-commit: 1a40dd535fb12cade584f085baa23734e8a9bb0e
Component: engine
2016-03-09 22:31:11 +02:00
79fb33ace9 Merge pull request #18766 from mikedanese/gcplogs
Add logging driver for Google Cloud Logging
Upstream-commit: 3c4d093babb6f4f4f8343f5c364c5229a9d96ba3
Component: engine
2016-03-02 02:09:44 +01:00
f87c5bb0dc Merge pull request #20825 from LK4D4/unused
Remove some unused structs and fields
Upstream-commit: 106793dcbe49aedd96d74b0c4b0e32a972032d06
Component: engine
2016-03-01 12:58:35 -08:00
307185d18b Merge pull request #20617 from nalind/journald-pkgconfig
Try to handle changing names for journal packages
Upstream-commit: 36401f20ceb8b689fb619df4f6c7219fe76b521c
Component: engine
2016-03-01 15:38:03 -05:00