# Coerce seems not working

**URL:** https://discuss.elastic.co/t/coerce-seems-not-working/341019
**Category:** Logstash
**Created:** [August 17, 2023, 1:13pm UTC](https://discuss.elastic.co/t/coerce-seems-not-working/341019 "2023-08-17T13:13:50Z")
**Posts on this page:** 4
**Page:** 1

<div class="post-metadata">

### Author: ![Jan\_Vavra](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/jan_vavra/32/122308_2.png) [@Jan\_Vavra](https://discuss.elastic.co/u/Jan_Vavra)
#### Post date: [August 17, 2023, 1:13pm UTC](https://discuss.elastic.co/t/coerce-seems-not-working/341019/1 "2023-08-17T13:13:50Z")

</div>

I am constructing datetime from directory structure, eg. 2023\08\17\15\08 represent files stored at 2023-08-17 15:08. I have this logstash.conf that parses each directory name into variables and hours and minutes are optional.

```auto
if [type] =~ "mytype" {
    grok {
      match => {"message" => [
        ## Info
        '%{TIMESTAMP_ISO8601:p_date} .* \[BACKUP\] "(?<p_dir_year>\d{4})[^\d](?<p_dir_month>\d{2})[^\d](?<p_dir_day>\d{2})(?:[^\d](?<p_dir_hour>\d{2})[^\d](?<p_dir_minute>\d{2})|)": %{NUMBER:p_dir_files}'
      ] }
    }
    mutate {
      coerce => {
        "p_dir_hour" => "00"
        "p_dir_minute" => "00"
      }
    }
    mutate {
      add_field => {
        "p_dir_timestamp" => "%{p_dir_year}-%{p_dir_month}-%{p_dir_day} %{p_dir_hour}:%{p_dir_minute}"
      }
    }

```

For case where there is a structure only for day, eg. 2023\08\16 I have in grok regex (?:...|) part. Parsing in variables works fine but if I want to assing default value usign coerce, the construction of iso8601 string variable p\_dir\_timestamp has this value  
"2023-08-17 %{p\_dir\_hour}:%{p\_dir\_minute}"

So no default value is assigned.  
For dirs with hours and minutes is everything ok.

What I am doing wrong ?

---

<div class="post-metadata">

### Author: ![Rios](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/rios/32/95745_2.png) [@Rios](https://discuss.elastic.co/u/Rios)
#### Post date: [August 18, 2023, 7:34pm UTC](https://discuss.elastic.co/t/coerce-seems-not-working/341019/2 "2023-08-18T19:34:52Z")

</div>

> coerce - Set the default value of a field that exists but is null

For instance, if ` "p_dir_hour" => nil`, you can use coerce to set default like 0 or empty string "".  
I think your fields do not exist at all, you can add:

```auto
if ![p_dir_hour] {
    mutate { coerce => { "p_dir_hour" => "00" } }
}

```

For a nil/null validation you should use ruby.

---

<div class="post-metadata">

### Author: ![Jan\_Vavra](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/jan_vavra/32/122308_2.png) [@Jan\_Vavra](https://discuss.elastic.co/u/Jan_Vavra)
#### Post date: [August 22, 2023, 7:33am UTC](https://discuss.elastic.co/t/coerce-seems-not-working/341019/3 "2023-08-22T07:33:54Z")

</div>

Ok. It also works:

```auto
 if ( ! [p_dir_hour])
    {
      mutate {
        add_field => {
          "p_dir_hour" => "00"
        }
      }
    }

```

---

<div class="post-metadata">

### Author: ![system](https://us1.discourse-cdn.com/elastic/original/3X/1/a/1ac57faf039f6b580b3f104ef42a2a89e41014de.png) [@system](https://discuss.elastic.co/u/system)
#### Post date: [September 19, 2023, 7:34am UTC](https://discuss.elastic.co/t/coerce-seems-not-working/341019/4 "2023-09-19T07:34:07Z")

</div>

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.
