# JSONL Files


# Read a JSONL File

Newline-delimited JSON (`.jsonl` / `.ndjson`) is a common format for streaming data and log records.


    916


``` python
from great_docs import tbl_preview

tbl_preview('assets/server_logs.jsonl', show_all=True)
```


<table class="gt_table" data-quarto-disable-processing="true" data-quarto-bootstrap="false">
<thead>
<tr class="gt_heading">
<th colspan="5" class="gt_heading gt_title gt_font_normal"><div style="padding-top: 0; padding-bottom: 7px;">
<span class="gd-tbl-badge" style="background-color: #E3F2FD; color: #1565C0; border: 1px solid #E3F2FD; margin-right: 8px;">JSONL</span>Rows8Columns4
</div></th>
</tr>
<tr class="gt_col_headings">
<th class="gt_col_heading gt_columns_bottom_border gt_right" scope="col"></th>
<th id="timestamp" class="gt_col_heading gt_columns_bottom_border gt_left" scope="col"><div>

timestamp

<em>str</em>

</div></th>
<th id="level" class="gt_col_heading gt_columns_bottom_border gt_left" scope="col"><div>

level

<em>str</em>

</div></th>
<th id="module" class="gt_col_heading gt_columns_bottom_border gt_left" scope="col"><div>

module

<em>str</em>

</div></th>
<th id="message" class="gt_col_heading gt_columns_bottom_border gt_left" scope="col"><div>

message

<em>str</em>

</div></th>
</tr>
</thead>
<tbody class="gt_table_body">
<tr>
<td class="gt_row gt_right gd-tbl-rownum">0</td>
<td class="gt_row gt_left" style="max-width: 153px">2025-01-15T08:30:00</td>
<td class="gt_row gt_left" style="max-width: 66px">INFO</td>
<td class="gt_row gt_left" style="max-width: 63px">auth</td>
<td class="gt_row gt_left" style="max-width: 250px">User login successful</td>
</tr>
<tr>
<td class="gt_row gt_right gd-tbl-rownum">1</td>
<td class="gt_row gt_left" style="max-width: 153px">2025-01-15T08:31:12</td>
<td class="gt_row gt_left" style="max-width: 66px">WARNING</td>
<td class="gt_row gt_left" style="max-width: 63px">db</td>
<td class="gt_row gt_left" style="max-width: 250px">Slow query detected (3.2s)</td>
</tr>
<tr>
<td class="gt_row gt_right gd-tbl-rownum">2</td>
<td class="gt_row gt_left" style="max-width: 153px">2025-01-15T08:32:45</td>
<td class="gt_row gt_left" style="max-width: 66px">ERROR</td>
<td class="gt_row gt_left" style="max-width: 63px">api</td>
<td class="gt_row gt_left" style="max-width: 250px">Request timeout on /v2/users</td>
</tr>
<tr>
<td class="gt_row gt_right gd-tbl-rownum">3</td>
<td class="gt_row gt_left" style="max-width: 153px">2025-01-15T08:33:01</td>
<td class="gt_row gt_left" style="max-width: 66px">INFO</td>
<td class="gt_row gt_left" style="max-width: 63px">cache</td>
<td class="gt_row gt_left" style="max-width: 250px">Cache miss for key user:42</td>
</tr>
<tr>
<td class="gt_row gt_right gd-tbl-rownum">4</td>
<td class="gt_row gt_left" style="max-width: 153px">2025-01-15T08:34:20</td>
<td class="gt_row gt_left" style="max-width: 66px">DEBUG</td>
<td class="gt_row gt_left" style="max-width: 63px">auth</td>
<td class="gt_row gt_left" style="max-width: 250px">Token refresh for session abc123</td>
</tr>
<tr>
<td class="gt_row gt_right gd-tbl-rownum">5</td>
<td class="gt_row gt_left" style="max-width: 153px">2025-01-15T08:35:55</td>
<td class="gt_row gt_left" style="max-width: 66px">ERROR</td>
<td class="gt_row gt_left" style="max-width: 63px">db</td>
<td class="gt_row gt_left" style="max-width: 250px">Connection pool exhausted</td>
</tr>
<tr>
<td class="gt_row gt_right gd-tbl-rownum">6</td>
<td class="gt_row gt_left" style="max-width: 153px">2025-01-15T08:36:10</td>
<td class="gt_row gt_left" style="max-width: 66px">INFO</td>
<td class="gt_row gt_left" style="max-width: 63px">api</td>
<td class="gt_row gt_left" style="max-width: 250px">Health check passed</td>
</tr>
<tr>
<td class="gt_row gt_right gd-tbl-rownum">7</td>
<td class="gt_row gt_left" style="max-width: 153px">2025-01-15T08:37:30</td>
<td class="gt_row gt_left" style="max-width: 66px">WARNING</td>
<td class="gt_row gt_left" style="max-width: 63px">auth</td>
<td class="gt_row gt_left" style="max-width: 250px">Failed login attempt from 192.168.1.100</td>
</tr>
</tbody>
</table>


# NDJSON Extension

The `.ndjson` extension is treated identically:


    'assets/server_logs.ndjson'


``` python
tbl_preview('assets/server_logs.ndjson', show_all=True)
```


<table class="gt_table" data-quarto-disable-processing="true" data-quarto-bootstrap="false">
<thead>
<tr class="gt_heading">
<th colspan="5" class="gt_heading gt_title gt_font_normal"><div style="padding-top: 0; padding-bottom: 7px;">
<span class="gd-tbl-badge" style="background-color: #E3F2FD; color: #1565C0; border: 1px solid #E3F2FD; margin-right: 8px;">JSONL</span>Rows8Columns4
</div></th>
</tr>
<tr class="gt_col_headings">
<th class="gt_col_heading gt_columns_bottom_border gt_right" scope="col"></th>
<th id="timestamp" class="gt_col_heading gt_columns_bottom_border gt_left" scope="col"><div>

timestamp

<em>str</em>

</div></th>
<th id="level" class="gt_col_heading gt_columns_bottom_border gt_left" scope="col"><div>

level

<em>str</em>

</div></th>
<th id="module" class="gt_col_heading gt_columns_bottom_border gt_left" scope="col"><div>

module

<em>str</em>

</div></th>
<th id="message" class="gt_col_heading gt_columns_bottom_border gt_left" scope="col"><div>

message

<em>str</em>

</div></th>
</tr>
</thead>
<tbody class="gt_table_body">
<tr>
<td class="gt_row gt_right gd-tbl-rownum">0</td>
<td class="gt_row gt_left" style="max-width: 153px">2025-01-15T08:30:00</td>
<td class="gt_row gt_left" style="max-width: 66px">INFO</td>
<td class="gt_row gt_left" style="max-width: 63px">auth</td>
<td class="gt_row gt_left" style="max-width: 250px">User login successful</td>
</tr>
<tr>
<td class="gt_row gt_right gd-tbl-rownum">1</td>
<td class="gt_row gt_left" style="max-width: 153px">2025-01-15T08:31:12</td>
<td class="gt_row gt_left" style="max-width: 66px">WARNING</td>
<td class="gt_row gt_left" style="max-width: 63px">db</td>
<td class="gt_row gt_left" style="max-width: 250px">Slow query detected (3.2s)</td>
</tr>
<tr>
<td class="gt_row gt_right gd-tbl-rownum">2</td>
<td class="gt_row gt_left" style="max-width: 153px">2025-01-15T08:32:45</td>
<td class="gt_row gt_left" style="max-width: 66px">ERROR</td>
<td class="gt_row gt_left" style="max-width: 63px">api</td>
<td class="gt_row gt_left" style="max-width: 250px">Request timeout on /v2/users</td>
</tr>
<tr>
<td class="gt_row gt_right gd-tbl-rownum">3</td>
<td class="gt_row gt_left" style="max-width: 153px">2025-01-15T08:33:01</td>
<td class="gt_row gt_left" style="max-width: 66px">INFO</td>
<td class="gt_row gt_left" style="max-width: 63px">cache</td>
<td class="gt_row gt_left" style="max-width: 250px">Cache miss for key user:42</td>
</tr>
<tr>
<td class="gt_row gt_right gd-tbl-rownum">4</td>
<td class="gt_row gt_left" style="max-width: 153px">2025-01-15T08:34:20</td>
<td class="gt_row gt_left" style="max-width: 66px">DEBUG</td>
<td class="gt_row gt_left" style="max-width: 63px">auth</td>
<td class="gt_row gt_left" style="max-width: 250px">Token refresh for session abc123</td>
</tr>
<tr>
<td class="gt_row gt_right gd-tbl-rownum">5</td>
<td class="gt_row gt_left" style="max-width: 153px">2025-01-15T08:35:55</td>
<td class="gt_row gt_left" style="max-width: 66px">ERROR</td>
<td class="gt_row gt_left" style="max-width: 63px">db</td>
<td class="gt_row gt_left" style="max-width: 250px">Connection pool exhausted</td>
</tr>
<tr>
<td class="gt_row gt_right gd-tbl-rownum">6</td>
<td class="gt_row gt_left" style="max-width: 153px">2025-01-15T08:36:10</td>
<td class="gt_row gt_left" style="max-width: 66px">INFO</td>
<td class="gt_row gt_left" style="max-width: 63px">api</td>
<td class="gt_row gt_left" style="max-width: 250px">Health check passed</td>
</tr>
<tr>
<td class="gt_row gt_right gd-tbl-rownum">7</td>
<td class="gt_row gt_left" style="max-width: 153px">2025-01-15T08:37:30</td>
<td class="gt_row gt_left" style="max-width: 66px">WARNING</td>
<td class="gt_row gt_left" style="max-width: 63px">auth</td>
<td class="gt_row gt_left" style="max-width: 250px">Failed login attempt from 192.168.1.100</td>
</tr>
</tbody>
</table>
