<!-- Generated by zircon/scripts/update-docs-from-fidl, do not edit! -->
# zx_debuglog_write

## Summary

Write a message to the kernel debuglog.

## Declaration

```c
#include <zircon/syscalls.h>

zx_status_t zx_debuglog_write(zx_handle_t handle,
                              uint32_t options,
                              const void* buffer,
                              size_t buffer_size);
```

## Description

`zx_debuglog_write()` attempts to write *buffer* of size *buffer_size* bytes
to the kernel debuglog. The log entry is written at severity `ZX_LOG_INFO`.

*buffer* does not strictly require any particular format, but most userspace
tooling assumes the contents will be a valid UTF-8 string without any
NUL-termination. *buffer* will be truncated to some size less than
ZX_LOG_RECORD_MAX so that it may fit in the `data` field of `zx_log_record_t`.

<!-- TODO(fxbug.dev/72345): Consider documenting ZX_LOG_LOCAL -->

*options* must be set to `0`.

## Rights

*handle* must be of type **ZX_OBJ_TYPE_LOG** and have **ZX_RIGHT_WRITE**.

## Return value

`zx_debuglog_read()` returns **ZX_OK** on success. In the event of failure,
a negative error value is returned.

## Errors

**ZX_ERR_ACCESS_DENIED**  *handle* does not have **ZX_RIGHT_WRITE**.

**ZX_ERR_BAD_HANDLE**  *handle* is not a valid handle.

**ZX_ERR_INVALID_ARGS**  An invalid value to *options* was given, or *buffer*
was an invalid pointer.

**ZX_ERR_WRONG_TYPE**  *handle* is not a debuglog handle.

## See also

 - [`fuchsia.boot.WriteOnlyLog`](https://fuchsia.dev/reference/fidl/fuchsia.boot#WriteOnlyLog)

 - [`zx_debug_write()`]
 - [`zx_debuglog_create()`]
 - [`zx_debuglog_read()`]

[`zx_debug_write()`]: debug_write.md
[`zx_debuglog_create()`]: debuglog_create.md
[`zx_debuglog_read()`]: debuglog_read.md

